我的代码从字符串中删除元音有什么问题?

时间:2013-10-26 01:53:02

标签: c string

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

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

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

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

5 个答案:

答案 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') {
    ...
}