c# 为什么我的switch语句中的默认大小写在成绩统计程序中意外执行?

3df52oht  于 2023-06-04  发布在  C#
关注(0)|答案(2)|浏览(163)
#include<stdio.h>
int main(){
    int grade;
    int aCount = 0;
    int bCount = 0;
    int cCount = 0;
    int dCount = 0;
    int fCount = 0;

    printf("Enter grades\n");
    printf("Enter the EOF to end input\n");

    while ((grade = getchar()) != EOF ){
        switch (grade){
            case 'A':
            case 'a':
                ++aCount;
                break;
            case 'B':
            case 'b':
                ++bCount;
                break;
            case 'C':
            case 'c':
                ++cCount;
                break;
            case 'D':
            case 'd':
                ++dCount;
                break;
            case 'F':
            case 'f':
                ++fCount;
                break;
            default:
                printf("Invalid\n");
                printf("Enter a new grade\n");
                break;      
    }
}
    printf("\nTotals for each letter are:\n");
    printf("A: %d\n", aCount);
    printf("B: %d\n", bCount);
    printf("C: %d\n", cCount);
    printf("D: %d\n", dCount);
    printf("F: %d\n", fCount);

    return 0;
}

这是一个例子程序在一本书中,我目前阅读计数字母成绩。因此,有了这个程序,我希望它,我可以输入所有的成绩在一行,并结束与EOF(Ctrl+Z),然后输入(例如:acffbcd)。然而,结果是switch occurred中的默认情况。(https://i.stack.imgur.com/zCR9b.png
我知道while循环会一直执行到getchar到达EOF,因此它永远不会读取换行符,所以默认情况不应该发生。我在while循环中将conditon改为(https://i.stack.imgur.com/Hg9ig.png),输入1来结束输入,而不是EOF,它可以按照我的要求完美地工作。
那么到底是什么问题呢?我将非常感谢你的帮助。

2w2cym1i

2w2cym1i1#

更改此:

while ((grade = getchar()) != EOF ){
    switch (grade){
        case 'A':
        case 'a':

忽略空白字符。不只是'\n'。空白字符包括空格、制表符、反向制表符、回车符、行尾和换页字符。

while ((grade = getchar()) != EOF ){
    if (grade == ' ' || grade == '\t' || grade == '\v' || grade == '\r' || grade == '\f' || grade == '\n') {
        continue; // ignore whitespace
    }
    switch (grade){
        case 'A':

简单地说:

while ((grade = getchar()) != EOF ){
    if (isspace(grade)) {
        continue;
    }
    switch (grade){
        case 'A':

如果isspace函数不能立即使用,可以通过在代码文件的顶部放置#include <ctype.h>来将其添加到程序中。

nue99wik

nue99wik2#

这个是正确的。

#include <stdio.h>
int main()
{

    int grade;
    int aCount = 0;
    int bCount = 0;
    int cCount = 0;
    int dCount = 0;
    int fCount = 0;

    printf("Enter grades\n");
    printf("Enter the EOF to end input\n");
// you have to change the EOF to '\n'
    while ((grade = getchar()) != '\n')
    {
        switch (grade)
        {
        case 'A':
        case 'a':
            ++aCount;
            break;
        case 'B':
        case 'b':
            ++bCount;
            break;
        case 'C':
        case 'c':
            ++cCount;
            break;
        case 'D':
        case 'd':
            ++dCount;
            break;
        case 'F':
        case 'f':
            ++fCount;
            break;
        default:
            printf("Invalid\n");
            printf("Enter a new grade\n");
            break;
        }
    }
    printf("\nTotals for each letter are:\n");
    printf("A: %d\n", aCount);
    printf("B: %d\n", bCount);
    printf("C: %d\n", cCount);
    printf("D: %d\n", dCount);
    printf("F: %d\n", fCount);

    return 0;
}

相关问题