我是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
节对处理转换说明符的第一步(我强调的是(有这样的说法:
除非规范包含
[
、c
或n
说明符,否则将跳过输入空白字符(由isspace
函数指定(
一个快速的解决方法是自己手动跳过空白,比如:
printf("Enter your grade: ");
scanf(" %c", &grade);
printf("Your grade is %c.", grade);
按照标准的同一部分:
由空白字符组成的指令是通过读取输入直到第一个非空白字符(未读(,或者直到无法读取更多字符来执行的。