首页 > 解决方案 > C程序不接受用户输入

问题描述

我是 C 编程的初学者。我正在学习用户输入。下面的一段代码:

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

    int main()
    {
        char grade;
        printf("Enter you grade: ");
        scanf("%c", &grade);
        printf("Your grade is %c.", grade);

        return 0;
     }

做我打算做的事情,即

但是当我将代码修改为以下内容时:

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

     int main()
    {
           int age;
           printf("Enter you age: ");
           scanf("%d", &age);  
           printf("You are %d years old.\n", age);

           printf("-----------------------------\n");
           double gpa;
           printf("Enter your GPA: ");
           scanf("%lf", &gpa);
           printf("Your GPA is %f. \n", gpa);

           printf("-----------------------------\n");
           char grade;
           printf("Enter you grade: ");
           scanf("%c", &grade);
           printf("Your grade is %c.", grade);

           return 0;
     }

它执行以下操作:

输出如下所示:

Enter you age: 45
You are 45 years old.
-----------------------------
Enter your GPA: 4
Your GPA is 4.000000. 
-----------------------------
Enter you grade: Your grade is 
.

请建议我做错了什么。

标签: c

解决方案


当您输入您的年龄时,这是在scanf(%d)开始检索字符之前输入缓冲区中的内容:

45<newline>

跳过缓冲区中的scan(%d)任何空白(没有任何空白),读取45,但留下换行符。然后,当您输入 GPA 时,这就是在scanf(%lf)开始检索字符之前输入缓冲区中的内容:

<newline>4<newline>

跳过缓冲区中的scan(%lf)任何空白(换行符),读取4,但再次离开换行符。scanf 换句话说,如果您的下一个下一个也跳过空格(例如从第一个条目移动到第二个条目),则前导换行符无关紧要。

scanf(%c)不会跳过空格。它只是读取下一个字符,即换行符:

<newline>A<newline>

这就是为什么 tour period 出现在下一行,它了一个字符,但那个字符是换行符而不是等级。

ISO C11 标准中的Section7.21.6.2 The fscanf function对处理转换说明符的第一步有这样的说法(我的重点):

输入空白字符(由isspace函数指定)将被跳过,除非规范包含[cn说明符。

一个快速的解决方法是自己手动跳过空格,例如:

printf("Enter your grade: ");
scanf(" %c", &grade);
printf("Your grade is %c.", grade);

根据标准的同一部分:

由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。


推荐阅读