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 标准中的Section7.21.6.2 The fscanf function
对处理转换说明符的第一步有这样的说法(我的重点):
输入空白字符(由
isspace
函数指定)将被跳过,除非规范包含[
、c
或n
说明符。
一个快速的解决方法是自己手动跳过空格,例如:
printf("Enter your grade: ");
scanf(" %c", &grade);
printf("Your grade is %c.", grade);
根据标准的同一部分:
由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。
推荐阅读
- swift - 用于 UI 更新的领域集合插入
- javascript - 来自 REST API 的 Aurelia 动态路由
- r - 使用 R 绘制时间序列中的观察值
- node.js - 获取有关 App Engine 资源的 IAM 政策
- python - 如何将函数传递给要设置为类变量的类?我收到“不可调用”错误
- java - 如何在 saxon 9.7+ s9api 中使用打包(导出)的样式表?
- sql - 需要在 SQL SERVER 中的一列上选择 DISTINCT
- python - 在 Python 中使用 cloudcraper / cfscrape / sellenium 绕过 reCAPTCHA
- mongodb - 如何使用其他两个字段的组合更新 mongodb 中的特定字段?
- python - Twitter 和 Python:在这里努力理解我的“列表索引超出范围”问题