繁体   English   中英

为什么我得到不完整的反转字符串

[英]Why am I getting incomplete reversed string

对于像这样的字符串输入 - “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.”

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";
}
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";   
}

仅当当前索引字符是句点时,代码中的语句才会附加该字符。

首先,第一个参数应该是对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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM