为什么逐个元素填充的字符串长度为零?

Why do I get zero length for a string filled element by element?

这是我的问题。我正在用 g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

编译

我想检查字符串的每个元素,只有是辅音才复制它。

我就是这样做的: 这只是 select 元音的函数:

bool _is_vowel(char a){
    if (a=='a' || a=='A' || a=='e' || a=='E' ||a=='i' || a=='I' || a=='o' || a=='O' || a=='u' || a=='U' || a=='y' || a=='Y')
        return true;
    else return false;
}

这是一段不起作用的代码。具体来说,ss.length() 内部看起来是 0,字符串 ss 不包含任何字符,但它们在 while 循环中正确打印。

 main(){
    int i=0, c=0; 
    string ss, name;
    cout << "insert name\n";
    getline(cin, name);
    while (i<int(name.length())){
       if (!_is_vowel(name[i])){
          cout << name[i]<< "\t";
          ss[c]=name[i];
          cout << ss[c]<< "\n";
          c++;
        }
        i++;
    }    

    cout << int(ss.length())<<endl;
    cout << ss;                
    } 

谁能给我解释一下哪里错了或者给我一些参考? 提前谢谢你

string ss;

声明一个长度为 0 的字符串。

ss[c] = ...;

然后尝试访问并设置一个不存在的索引。这是未定义的行为。如果您使用 .at() 进行边界检查,您会立即发现这一点。

要解决此问题,您可以使用 += operator:

附加到字符串
ss += name[i];

或者您可以使用 push_back():

ss.push_back(name[i]);

此外,而不是检查每个。单身的。性格,我强烈建议看看 以获得更好的方法。

问题出在你的 while 循环中,很容易解决:

ss += name[i];

您只需连接到您的字符串