我为实践编写了这个简单的程序:

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

#define CLASSES 3
#define STUDENTS 4
int grades[CLASSES][STUDENTS];

int main(void)
{
    int i = 1;
    char t,k;
    while(i == 1)
    {
        printf("\n\n\nMENU:\nEnter the grades(E)\nReport Grades(R)\nQuit(Q)\nYour choice: ");
        k = toupper(getchar());
        printf("Input entered... %c\n", k);
        switch(k) {
            case 'E' :
                printf("Entering the grades..\n");
                break;
            case 'R' :
                printf("Reporting the grades...\n");
                break;
            case 'Q' :
                printf("Quitting the program...\n");
                exit(0);
                break;
            default:
                printf("ERROR: %c: Incorrect menu option\n", k);
                break;
        }

    }
    return 0;
}

当我运行它时,它首先要求我输入一个选择。如果输入“E”或“R”,它将进入相应的“case”块,但是在while循环内的下一次迭代中,它不会等待我输入选择。相反,它假设我输入了“NULL”,并要求我第三次输入提示。每当我输入选择项时,这种情况就会不断发生。这是该程序的输出。我在这里想念什么?
host-mb:c_practice host$ ./asd



MENU:
Enter the grades(E)
Report Grades(R)
Quit(Q)
Your choice: E
Input entered... E
Entering the grades..



MENU:
Enter the grades(E)
Report Grades(R)
Quit(Q)
Your choice: Input entered...

ERROR:
: Incorrect menu option



MENU:
Enter the grades(E)
Report Grades(R)
Quit(Q)
Your choice: R
Input entered... R
Reporting the grades...



MENU:
Enter the grades(E)
Report Grades(R)
Quit(Q)
Your choice: Input entered...

ERROR:
: Incorrect menu option



MENU:
Enter the grades(E)
Report Grades(R)
Quit(Q)
Your choice: Q
Input entered... Q
Quitting the program...
host-mb:c_practice host$

最佳答案

发生这种情况是因为您键入字母,然后按Enter。使用另一个getchar()来吃结尾的换行符。

所以改变这个:

k = toupper(getchar());

对此:
k = toupper(getchar());
getchar(); // eat the trailing newline

当用户输入内容时,它将转到 stdin (标准输入)流,并且系统确保将用户键入的内容存储在内部缓冲区中。所以这是您的代码发生的事情:

因此,解决方案是吃掉尾随的换行符!

复活节彩蛋提示:

您应该收到以下信息:
warning: implicit declaration of function ‘printf’

由于缺少IO header ,因此应在主文件顶部添加以下内容:
#include <stdio.h>

同样,您应该添加:
#include <ctype.h>  // for toupper()
#include <stdlib.h> // for exit()

另一个解决方案是使用fgets(),有关更多C - scanf() vs gets() vs fgets()的信息,请参见此问题。

我在使用scanf()时遇到了与您类似的问题,当时我在您的鞋子里,所以当时我记下了solution

关于c - 为什么在while循环中将此语句打印两次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29502486/

10-10 14:40