首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在For循环内执行Switch语句超过10次-C

无法在For循环内执行Switch语句超过10次-C
EN

Stack Overflow用户
提问于 2015-08-24 23:17:20
回答 2查看 85关注 0票数 2

我目前正在学习C语言,我有一个练习,要求输入20个字符,并显示('a','e','i','o','u')的数量。我编写了以下代码:

代码语言:javascript
运行
复制
#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次。为什么会发生这种情况?警局。对不起,我的英语很差。

EN

回答 2

Stack Overflow用户

发布于 2015-08-24 23:47:10

正如注释中提到的,您正在处理20个字符,但其中一半是换行符。如果你去掉你的代码行system("cls"),这会变得很明显:

代码语言:javascript
运行
复制
% ./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个字符来进一步了解它是如何工作的。例如,如果我提供了21个字符的输入aaaaaeeeeeiiiiiooooo<RET>,您可以看到前20个字符已被处理:

代码语言:javascript
运行
复制
 % ./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
EN

Stack Overflow用户

发布于 2015-08-24 23:48:00

您需要忽略换行符。

代码语言:javascript
运行
复制
#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,它也能解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32185870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档