无法在For循环内执行Switch语句10次以上 - C

时间:2015-08-24 15:17:20

标签: c loops for-loop switch-statement

我目前正在学习C,我有一个练习,请求20个字符,并显示(' a'' e','我''○'' U&#39)。 我编码了这个:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
    char letter;
    int a = 0, e = 0, i = 0, o = 0, u = 0, x;
    for(x = 0; x < 20; x++)
    {
        printf("\nEnter a character: ");
        letter = getchar();
        letter = tolower(letter);
        switch(letter)
        {
            case 'a':
                a += 1;
                break;
            case 'e':
                e += 1;
                break;
            case 'i':
                i += 1;
                break;
            case 'o':
                o += 1;
                break;
            case 'u':
                u += 1;
                break;
            default:
                continue;
        }
        system("cls");
    }
    printf("\nAmount of 'a': %d", a);
    printf("\nAmount of 'e': %d", e);
    printf("\nAmount of 'i': %d", i);
    printf("\nAmount of 'o': %d", o);
    printf("\nAmount of 'u': %d\n", u);
    system("pause");
    return 0;
}

但这只能执行10次。为什么会这样? PD。抱歉我的英语很差。

2 个答案:

答案 0 :(得分:1)

如评论中所述,您处理的是20个字符,但其中一半是换行符。如果你拿出你的专栏system("cls"),那就显而易见了:

% ./ctest

Enter a character: a

Enter a character: 
Enter a character: b

Enter a character: 
Enter a character: c

在第一个提示符下,我键入了a<RET>,第一个循环迭代(x=0)处理了a,但仍然有一个<RET>在输入缓冲区中等待。第二个循环迭代(x=1)获取下一个可用字符<RET>并处理它,第三个循环迭代(x=2)打印其提示并等待新输入。

您可以通过让它处理您正在计算的20个字符来进一步了解其工作原理。例如,如果我提供输入aaaaaeeeeeiiiiiooooo<RET>,即21个字符,您可以看到前20个处理:

 % ./ctest

Enter a character: aaaaaeeeeeiiiiiooooo

Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Enter a character: 
Amount of 'a': 5
Amount of 'e': 5
Amount of 'i': 5
Amount of 'o': 5
Amount of 'u': 0

要解决此问题,您应该阅读并丢弃换行符或使用可忽略换行符的其他阅读方法。

答案 1 :(得分:1)

您需要忽略换行符。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()

{
    char letter;
    int a = 0, e = 0, i = 0, o = 0, u = 0, x;
    for (x = 0; x < 20; x++)
    {
        printf("\nEnter a character: ");
        letter = getchar();
        letter = tolower(letter);
        if (letter == '\n')
        {
            x--;
            system("cls");
            continue;
        }
        if (letter)
        {
            switch (letter)
            {
            case 'a':
                a += 1;
                break;
            case 'e':
                e += 1;
                break;
            case 'i':
                i += 1;
                break;
            case 'o':
                o += 1;
                break;
            case 'u':
                u += 1;
                break;
            default:
                break;
            }

        }
        system("cls");
    }
    printf("\nAmount of 'a': %d", a);
    printf("\nAmount of 'e': %d", e);
    printf("\nAmount of 'i': %d", i);
    printf("\nAmount of 'o': %d", o);
    printf("\nAmount of 'u': %d\n", u);
    system("pause");
    return 0;
}

您可以使用scanf代替getchar,它也可以解决它。