c - Scanf 在输入 Char 后跳过用户输入
问题描述
我有一段代码只要求用户输入并在用户输入 0 或更少时不断提示用户输入。
float n;
do {
printf("Enter a number: ");
scanf_s("%f", &n);
} while (n <= 0);
但是当用户输入一个 Char 时,它会一直执行 printf() 而不提示或等待用户输入。
我使用了带断点的 Visual Studio 调试器,发现在用户按下任何键的情况下执行了 scanf(),所以我不知道这里发生了什么。
解决方案
您可能知道也可能不知道,scanf_s()
返回成功转换并分配给变量的项目数。但是,当没有项目转换和分配成功时,它返回 0。
在您的情况下,scanf_s()
需要浮动。因此,当char
输入 a 时,它与转换说明符不匹配并失败。结果,scanf_s()
返回 0。
此外,字符不会被消耗并保留在输入缓冲区中。所以scanf_s()
将继续在同一个字符上失败并无限循环。
解决方案
scanf_s()
1) 检查失败的返回值。
2) 失败时消耗所有未读字符。
建议
1)初始化您的变量n
,因为即使 scanf_s() 失败也会对其进行评估。
2)由于您希望用户输入大于0的数字,因此在提示输入时要特别说明。
代码
float n = 0; /* initialize the variable */
do {
printf("Enter a number greater than 0: ");
if (scanf_s("%f", &n, 1) != 1)
while (getchar() != '\n'); /* consume any unread characters */
} while (n <= 0);
推荐阅读
- oracle - oracle 多列中存在的 COUNT 个不同值
- excel - 在所有单元格中搜索单词“是”的所有实例的表格,在新工作表中找到每个“是”创建行
- deep-learning - Resnet 18 和 Resnet 20 有什么区别?
- json - 来自 WordPress Post 的 UIImage 的 JSON 请求
- ssms - Windows 更新后 SSMS 查询快捷方式丢失
- python - 将具有多列的熊猫数据框转置为多行
- reactjs - AsyncStorage 将令牌传递给标头发布请求
- php - Codeignitor URL 冲突
- c - 动态 DMA 传输
- python - Mask-RCNN/TensorFlow:不同的图像格式(jpg、png)会影响Mask-RCNN的训练结果吗?