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

时间:2019-02-20 17:26:16

标签: c++ string string-length

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

进行编译

我想检查字符串的每个元素,并仅在它是辅音的情况下复制它。

这是我尝试执行的操作: 这只是选择元音的功能:

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

任何人都可以向我解释我错了或给我一些参考吗? 预先谢谢你

2 个答案:

答案 0 :(得分:4)

ViewHolder pattern

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

string ss;

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

要解决此问题,您可以使用+= operator将其附加到字符串之后:

ss[c] = ...;

或者您可以使用push_back()

ss += name[i];

此外,无需检查所有内容。单。角色,我强烈建议您看看this answer,以寻求更好的方法。

答案 1 :(得分:0)

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

ss += name[i];

您只需要连接到您的字符串