【发布时间】:2019-02-20 17:26:16
【问题描述】:
这是我的问题。我正在使用 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;
}
谁能向我解释我错在哪里或给我一些参考? 提前谢谢你
【问题讨论】:
-
ss[c]访问一个不存在的字符。使用ss += name[i]。 -
有一种更简单的方法来处理这个问题,无需任何手动循环:
std::string ss = name; ss.erase(std::remove_if(ss.begin(), ss.end(), _is_vowel), ss.end()); -
@JesperJuhl 以单个前导
_开头的标识符也是保留的,但仅限于全局范围。 -
@JesperJuhl
_is_vowel似乎是在全局范围内声明的。 -
@Eljay 该标准规定定义保留标识符具有未定义的行为。该规则确实可以避免名称冲突,但某些类型的定义,尤其是宏,可能会产生非常不可预测的结果。
标签: c++ string string-length