为什么逐个元素填充的字符串长度为零?
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];
您只需连接到您的字符串
这是我的问题。我正在用 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];
您只需连接到您的字符串