移除字符串中元音的C++程序未得预期输出,求问题排查
问题分析与解决
嘿,我一眼就瞅出问题所在啦——你的程序没移除元音的核心原因,是条件判断里的逻辑运算符用错了!咱们来拆解下:
错误原因
你当前的判断条件用了||(逻辑或):
if(orig[i] != 'a' || orig[i] != 'A' ||orig[i] != 'e'||orig[i] != 'E'||orig[i] != 'i'||orig[i] != 'I'|| orig[i] != 'o'||orig[i] != 'O'||orig[i] != 'u'||orig[i] != 'U')
这个逻辑完全不对!举个例子:如果当前字符是'a',那么orig[i] != 'a'是假,但orig[i] != 'A'是真——只要有一个||连接的条件为真,整个表达式就为真,所以'a'会被直接加到temp里。不管字符是不是元音,这个条件永远都会成立,自然输出的就是原字符串了。
修正方案
把所有的||换成&&(逻辑与),这样只有当字符同时不是所有元音字母的时候,才会被保留:
#include<iostream> #include<string> using namespace std; int main(){ string orig; string temp; cin >> orig; for(int i=0 ; i<orig.size() ; i++){ // 把||全部替换成&& if(orig[i] != 'a' && orig[i] != 'A' && orig[i] != 'e' && orig[i] != 'E' && orig[i] != 'i' && orig[i] != 'I' && orig[i] != 'o' && orig[i] != 'O' && orig[i] != 'u' && orig[i] != 'U'){ temp += orig[i]; } } cout<<temp; return 0; }
更简洁的写法(可选)
如果你觉得写一堆判断太繁琐,可以把元音字母放到一个字符串里,用string::find方法来判断,代码会清爽很多:
#include<iostream> #include<string> using namespace std; int main(){ string orig; string temp; const string vowels = "aeiouAEIOU"; // 把所有元音存到一个字符串里 cin >> orig; for(char c : orig){ // 用范围for循环更直观 if(vowels.find(c) == string::npos){ // find找不到字符时返回npos temp += c; } } cout<<temp; return 0; }
这个写法的逻辑是:如果当前字符在元音字符串里找不到(也就是不是元音),就把它加到结果中,代码可读性和维护性都更好。
内容的提问来源于stack exchange,提问作者Ashish M
相关产品推荐
相关产品推荐

