为什么在使用string [i]处理字符串后,string.length()= 0?

时间:2019-01-14 16:29:58

标签: c++ string

我用C ++编写了一个程序,以一个句子作为输入,并希望在省略空格后显示该句子,但是我得到了奇怪的结果... s2是包含空格后的句子的字符串。 我可以将字符串s2作为s2 [i]访问,但是当我尝试cout << s2时却没有输出。并且s2.length()的值显示为0 ??

#include<iostream>
using namespace std;
int main()
{
    string s1,s2;
    int i,j,l1,l2;
    getline(cin,s1);
    l1=s1.length();
    j=0;
    for(i=0;i<l1;i++)
    {
        if(s1[i]!=' ')
        {
            s2[j]=s1[i];
            j++;
        }
    }
    cout<<s2.length();
    cout<<s2<<endl;
} 

预期:s2.length()不应为0并且cout << s2;应该管用。

4 个答案:

答案 0 :(得分:3)

s2[j]=s1[i];

s2最初是空的。访问s2[j]超出范围并且行为未定义。

将其更改为s2+=s1[i],一切都很好。


更新仅供参考,在现代C ++中,您通常不需要处理长度,因为您应该更喜欢使用标准库算法:

#include<iostream>
#include<string>
#include<algorithm>

int main()
{
    std::string s1,s2;
    getline(std::cin,s1);
    std::copy_if(s1.begin(), s1.end(), std::back_inserter(s2), [](char ch){
        return ch!=' ';
    });
    std::cout<<s2.length();
    std::cout<<s2<<'\n';
}

答案 1 :(得分:2)

默认构造的字符串的长度为0。

s2[j]访问索引j处的字符。如果该字符不存在,则程序的行为是不确定的。

当字符串的长度为0时,对于任何大于0的js2[j]都具有不确定的行为,因为该字符不存在。 s2[0]定义明确,指的是空终止符。

您可能打算在字符串中添加字符。例如,您可以使用push_back成员函数或+=运算符将字符添加到字符串中。

答案 2 :(得分:0)

您不能使用[]来增加s2字符串的大小。如果您使用调整大小来预先增加它,它应该可以工作:

        s2.resize(j+1);
        s2[j]=s1[i];
        j++;
在std :: string上字符的

push_back()会做同样的事情。但是,我会为您提供此答案,因为它会保留您已有的字符分配。最小的回答/改变的哲学:-)。

答案 3 :(得分:-1)

#include<iostream>
using namespace std;
int main()
{
    string s1,s2;
    int i,l1;
    getline(cin,s1);
    l1=s1.length();
    for(i=0;i<l1;i++)
    {
        if(s1[i]!=' ')
        {
            s2.push_back(s1[i]); //CHANGE MADE HERE
        }
    }
    cout<<s2.length();
    cout<<s2<<endl;
} 

如@iBug所述,您也可以使用上图所示的push_back