c - 为什么这会创建两个输入而不是一个
问题描述
https://i.imgur.com/FLxF9sP.png
如上面的链接所示,我必须输入 '<' 两次而不是一次,这是为什么呢?此外,似乎第一个输入被忽略了,但第二个“<”是程序识别的那个。
即使没有循环也会发生同样的事情。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int randomGen, upper, lower, end, newRandomGen;
char answer;
upper = 100;
lower = 1;
end = 1;
do {
srand(time(0));
randomGen = rand()%(upper + lower);
printf("%d\n", randomGen);
scanf("%s\n", &answer);
}while(answer != '=');
}
解决方案
scanf
格式字符串中的空格,例如\n
in "%c\n"
,尝试匹配任意数量的空格,并且scanf
不知道没有空格可以跳过,直到遇到不是空格的内容(例如您键入的第二个字符)或结尾输入。您向它提供=\n
,它会填充%c
并等待空格结束。然后你提供另一个=
并scanf
返回。第二次,这个角色可以是任何东西,它仍然可以工作。
跳过前导空格(并为一个字符使用正确的说明符,%c
如前所述):
scanf(" %c", &answer);
此外,确保您确实成功地阅读了某些内容是一种很好的做法,尤其是当无法阅读某些内容时,意味着将其保留为未初始化并稍后尝试阅读(未定义行为的另一个示例)。所以 checkscanf
的返回值应该与您提供的转换说明符的数量相匹配:
if (scanf(" %c", &answer) != 1) {
return EXIT_FAILURE;
}
推荐阅读
- sql - POSTGRESQL - 查找具有特定连接表数据集的行
- java - 无法让我的代码重复问题以继续游戏
- python - 通过 exec 导入 Python 不起作用,而硬编码导入起作用
- json - Laravel Simplexml 错误尚无法将复杂类型分配给属性
- ruby-on-rails - Rails ActiveJob 无法加载 aws-sdk-transcribeservice
- javascript - 我写了一个递归函数,但它只返回一个孩子,我怎样才能让它返回所有孩子?
- python - 转置 DataFrame 后将行设置为标题的首选方法
- android - Android ExoPlayer 演示:在屏幕锁定的情况下继续播放
- delphi - E2010 不兼容的类型
- python - 树莓派 python 编辑器