C程序不接受用户输入

  • 本文关键字:用户 不接受 程序 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;
}

它执行以下操作:

  • 询问年龄
  • 显示年龄
  • 要求gpa
  • 显示gpa
  • 要求评分
  • 它不显示等级

输出看起来像:

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

请告诉我我做错了什么。

当您输入年龄时,这是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标准中的7.21.6.2 The fscanf function节对处理转换说明符的第一步(我强调的是(有这样的说法:

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

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

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

按照标准的同一部分:

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

最新更新