我是编程新手,我决定做一些简单的编程练习。 挑战是从用户输入的字符串中删除所有元音。 我已经编写了代码,但我不知道为什么它不起作用。
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
bool isVowel(char ch)
{
char charToBeTested = tolower(ch);
if(charToBeTested == 'a' || 'e' || 'i' || 'o' || 'u')
return true;
else
return false;
}
int main()
{
int i;
char formattedString[80];
printf("Enter a string: ");
scanf("%s", &formattedString);
for(i = 0; i < strlen(formattedString); i++)
{
if(isVowel(formattedString[i]) == true)
{
formattedString[i] = ' ';
}
}
printf("%s", formattedString);
return 0;
}
它应该做的就是检查字符串中的每个字符,看看它是否是元音。如果是元音,请用空格替换当前字符。我将编写函数以便以后删除空格。
感谢所有帮助,抱歉这样的菜鸟!
答案 0 :(得分:2)
此代码不符合您的预期:
if (charToBeTested == 'a' || 'e' || 'i' || 'o' || 'u') {
...
}
C将此解释为
if ((charToBeTested == 'a') || 'e' || 'i' || 'o' || 'u') {
...
}
此处,||
运算符直接应用于字符文字'e'
,'i'
等。由于C将任何非零值视为“true”,因此此语句始终求值为真。
要解决此问题,请尝试重写:
if (charToBeTested == 'a' ||
charToBeTested == 'e' ||
charToBeTested == 'i' ||
charToBeTested == 'o' ||
charToBeTested == 'u') {
...
}
或者,使用switch
声明:
switch (charToBeTested) {
case 'a': case 'e': case 'i': case 'o': case 'u':
return true;
default:
return false;
}
此外,您可能希望使用tolower
,以便测试不区分大小写。
希望这有帮助!
答案 1 :(得分:1)
您需要单独测试每个替代方案:
char c = tolower(ch);
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
您的原始代码是:
if (charToBeTested == 'a' || 'e' || 'i' || 'o' || 'u')
编译器将其评估为:
if ((charToBeTested == 'a') || true)
因为'e'
不为零且任何非零的表达式都为真。
如果它真的彻底优化,可以推断整个表达式总是为真,无论charToBeTested
的值如何,因此它可以将整个函数减少到return true
(无需调用{{} 1}}。如果它是一个静态函数,它甚至可以完全消除函数调用。是否有任何编译器实际上是那种激进的东西可以辩论。
答案 2 :(得分:1)
这是不正确的:
if(charToBeTested == 'a' || 'e' || 'i' || 'o' || 'u')
正确的是:
if(charToBeTested == 'a' || charToBeTested == 'e' || charToBeTested == 'i' || charToBeTested == 'o' || charToBeTested == 'u')
或者,您可以创建静态表,例如:
char vowels[0x100] = {
['a'] = 1,
['e'] = 1,
['i'] = 1,
['o'] = 1,
['u'] = 1,
};
测试:
if(vowels[(unsigned char)charToBeTested])
答案 3 :(得分:1)
您需要将isVowel函数重写为:
bool isVowel(char ch)
{
char charToBeTested = tolower(ch);
if(charToBeTested == 'a') {
return true;
} else if(charToBeTested == 'e') {
return true;
} else if(charToBeTested == 'i') {
return true;
} else if(charToBeTested == 'o') {
return true;
} else if(charToBeTested == 'u') {
return true;
} else {
return false;
}
}
或者,您可以使用switch语句执行相同的操作,如下所示:
bool isVowel(char ch)
{
char charToBeTested = tolower(ch);
switch(charToBeTested) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
return true;
default:
return false;
}
}
答案 4 :(得分:0)
只是为了补充每个人的答案;正如他们所说,你需要修改你的测试标准。 另外,不要忘记检查大写版本:
if (charToBeTested == 'a' ||
charToBeTested == 'e' ||
charToBeTested == 'i' ||
charToBeTested == 'o' ||
charToBeTested == 'u' ||
charToBeTested == 'A' ||
charToBeTested == 'E' ||
charToBeTested == 'I' ||
charToBeTested == 'O' ||
charToBeTested == 'U') {
...
}