【问题标题】:Why am I getting incomplete reversed string为什么我得到不完整的反向字符串
【发布时间】:2020-12-27 03:39:49
【问题描述】:

对于这样的字符串输入——“i.like.this.program.very.much”,输出应该是“much.very.program.this.like.i”。

这是我的代码 -

void func(string s,int n){
    vector<string>v;
    string temp="";
          for(int j=0;j<n;j++){
            if(s[j]!='.'){
                temp+=s[j];
            }
            else{
                v.push_back(temp);
                temp="";
            }
        }
    reverse(v.begin(),v.end());
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<".";
    }
    cout<<"\n";   
}

这里的'n'是字符串长度,'s'是字符串。我得到的输出是 - “very.program.this.like.i.”

【问题讨论】:

  • 请提取并提供minimal reproducible example,包括算法未给出预期结果的最短输入(硬编码,而不是通过标准输入)。此外,使用调试器单步执行代码,您可能会自己识别错误。作为这里的新用户,也可以使用tour 并阅读How to Ask

标签: c++ string stl


【解决方案1】:

对于初学者来说,第一个参数应该是对std::string 类型对象的常量引用。

void func( const string &s, int n);

但如果编译器支持 C++ 17 标准,那么第一个参数最好是 std::string_view 类型。

第二个参数是多余的。

该函数应该返回反转的字符串。

您可以使用字符串流来代替循环。

在循环中,最后一个符号'.' 之后的子字符串不会附加到向量中。

使用容器 std::forward_list 代替向量会更好,因为您不需要反转它的元素。

我可以建议以下函数定义,如下面的演示程序所示。

#include <iostream>
#include <string>
#include <forward_list>
#include <iterator>
#include <sstream>

std::string reverse( const std::string &s, char c = '.' )
{
    std::istringstream is( s );
    std::forward_list<std::string> list;
    
    std::string word;
    
    while ( getline( is, word, c ) ) list.push_front( word );
    
    bool first = true;
    std::string result;
    result.reserve( s.size() );     

    for ( const auto &item : list )
    {
        if ( !first ) result += c;
        else first = false;
        result += item;
    }
    
    return result;
}

int main() 
{
    std::string s(  "i.like.this.program.very.much" );
    
    std::cout << reverse( s ) << '\n';
    
    return 0;
}

程序输出是

much.very.program.this.like.i

【讨论】:

    【解决方案2】:
    void func(string s,int n){
        vector<string>v;
        string temp="";
              for(int j=0;j<n;j++){
                if(s[j]!='.' || j==0){
                    temp+=s[j];
                }
                else{
                    v.push_back(temp);
                    temp="";
                }
            }
        reverse(v.begin(),v.end());
        for(int i=0;i<v.size();i++){
            cout<<v[i]<<".";
        }
        cout<<"\n";   
    }
    

    代码中的语句仅在当前索引字符为句点时附加字符。

    【讨论】:

      【解决方案3】:

      else 块仅在遇到句点时执行。由于字符串末尾没有句点,因此它永远不会推回最后一个单词。

      void func(string s, int n) {
          vector<string>v;
          string temp = "";
          for (int j = 0; j < n; j++) {
              if (s[j] != '.') {
                  temp += s[j];
              }
              else {
                  v.push_back(temp);
                  temp = "";
              }
          }
          // v.push_back(temp); This will push the last word / letters
          
          reverse(v.begin(), v.end());
          for (int i = 0; i < v.size(); i++) {
              cout << v[i] << ".";
          }
          cout << "\n";
      }
      

      【讨论】:

      • 非常感谢,伙计!
      猜你喜欢
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多