使用switch-case结构来计算键入数字的次数

问题描述 投票:2回答:4

创建一个C程序,计算每个数字0-4被输入的次数。使用switch-case结构。使用default计算其他字符的数量。打印键入特定数字的次数。

这是我的代码:

int main()
{
    int a;
    int num_0 = 0;
    int num_1 = 0;
    int num_2 = 0;
    int num_3 = 0;
    int num_4 = 0;
    int num_other = 0;
    printf("Input something\n");

    while ((a = getchar()) != EOF)
    {
        switch (a)
        {
        case 0:
            num_0++;break;
        case 1:
            num_1++;break;
        case 2:
            num_2++;break;
        case 3:
            num_3++;break;
        case 4:
            num_4++;break;
        default:
            num_other++;break;
        };

    }
    printf("0 has been typed %d", num_0);printf(" times\n");
    printf("1 has been typed %d", num_1);printf(" times\n");
    printf("2 has been typed %d", num_2);printf(" times\n");
    printf("3 has been typed %d", num_3);printf(" times\n");
    printf("4 has been typed %d", num_4);printf(" times\n");
    printf("other characters have been typed %d", num_other);printf(" times\n");

    return 0;
}

无论我输入什么,包括0,1,2,3,4在内的所有数字都算作其他字符。有人能告诉我为什么我的代码不起作用。

c character-encoding
4个回答
4
投票

switch (a)将比较a的代码。如果你输入数字,它应该是;

    case '0':
        num_0++;break;
    case '1':
        num_1++;break;
  ...

切换字符值不是整数(0的int值不是0,例如在ASCII中它是48,但是我们不直接使用该值,所以它是完全可移植的)

也许更好的办法是创建一个表:

int count[10] = {0};

....
a -= '0';  // removes the offset
if ((a >= 0) && (a < 10))  // check bounds
{
    count[a]++;
}

0
投票

你的答案是在man getchar(强调我的)

fgetc()从流中读取下一个字符并将其作为unsigned char强制转换为int,或者在文件末尾或错误时返回EOF

getc()等同于fgetc(),除了它可以实现为一个不止一次评估流的宏。

getchar()相当于getc(stdin)

之后,角色的数字表示不必与字符值相同(并且大多数情况下不是),即字符0'0')不具有0in ASCII encoding的数值,它具有小数值48

所以,要计算一个字符'0',你应该将case值设置为'0',而不是0


0
投票
a = getchar()

在读取字符时,存储在变量中的值是ASCII值。键入1时,存储在a中的值为49。

switch (a)
{
    case 1:
    num_0++;
    break;
}

在此代码中,您将与ASCII值49(ASCII值为1)进行比较,ASCII值为1,比较返回false。同样,所有条件都给出了错误并转到默认情况。


0
投票

您的代码中存在一些错误。

1)您通过getchar()函数获取输入,因此它在输入中需要字符。

2)将输入变量'a'作为char而不是int。

3)在案例选项中标记单引号,例如案例'1',因为您将输入作为字符,因此您必须标记单引号。

© www.soinside.com 2019 - 2024. All rights reserved.