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

Why is string.length()=0 after processing string using string[i]?

本文关键字:string 字符串 处理 length 为什么      更新时间:2023-10-16

我在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; 应该工作。

s2[j]=s1[i];

s2最初为空。访问s2[j]是越界和未定义的行为。

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


供参考,在 mordern 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';
}

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

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

当字符串的长度为 0 时,对于任何大于 0 的js2[j]具有未定义的行为,因为该字符不存在。 s2[0]定义良好,并引用空终止符。

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

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

        s2.resize(j+1);
        s2[j]=s1[i];
        j++;

std::string 上的字符的 push_back() 也会做同样的事情。但是,我为您提供此答案,因为它保留了您已经拥有的角色分配。最小答案/更改的哲学:-)。

#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如上所示