1

我是编程新手,我决定做一些简单的编程练习。挑战是从用户输入的字符串中删除所有元音。我已经编写了代码,但我不知道为什么它不起作用。

#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;
}

它应该做的就是检查字符串中的每个字符,看看它是否是元音。如果是元音,则用空格替换当前字符。稍后我将编写删除空格的函数。

感谢所有帮助,很抱歉成为这样的菜鸟!

4

5 回答 5

2

这段代码没有做你认为它做的事情:

if (charToBeTested == 'a' || 'e' || 'i' || 'o' || 'u') {
    ...
}

C 将其解释为

if ((charToBeTested == 'a') || 'e' || 'i' || 'o' || 'u') {
    ...
}

在这里,||运算符直接应用于字符文字'e','i'等。由于 C 将任何非零值视为“真”,因此该语句的计算结果始终为真。

要解决此问题,请尝试像这样重写它:

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不区分大小写的方式进行测试。

希望这可以帮助!

于 2013-10-26T01:55:20.193 回答
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(无需调用tolower()。如果它是一个静态函数,它甚至可以消除完全调用函数。任何编译器实际上是否会如此激进还有待商榷。

于 2013-10-26T01:55:28.923 回答
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])
于 2013-10-26T01:55:54.560 回答
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;
    }
}
于 2013-10-26T01:57:59.983 回答
0

只是为了补充每个人的答案;正如他们所说,您需要修复您的测试标准。另外,不要忘记检查大写版本:

if (charToBeTested == 'a' || 
    charToBeTested == 'e' || 
    charToBeTested == 'i' || 
    charToBeTested == 'o' || 
    charToBeTested == 'u' ||
    charToBeTested == 'A' || 
    charToBeTested == 'E' || 
    charToBeTested == 'I' || 
    charToBeTested == 'O' || 
    charToBeTested == 'U') {
    ...
}
于 2013-10-26T02:00:27.110 回答