这是我的问题。我正在使用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;
}
任何人都可以向我解释我错了或给我一些参考吗? 预先谢谢你
答案 0 :(得分:4)
ViewHolder pattern
声明一个长度为0的字符串。
string ss;
然后尝试访问并设置为不存在的索引。。这是未定义的行为。如果您使用过.at()
进行边界检查,那么您会立即发现这一点。
要解决此问题,您可以使用+=
operator将其附加到字符串之后:
ss[c] = ...;
或者您可以使用push_back()
:
ss += name[i];
此外,无需检查所有内容。单。角色,我强烈建议您看看this answer,以寻求更好的方法。
答案 1 :(得分:0)
问题出在您的while循环中,很容易解决:
ss += name[i];
您只需要连接到您的字符串