gpt4 book ai didi

c - 如果我之前输入了某个输入,为什么 scanf() 不等待下一个输入

转载 作者:太空宇宙 更新时间:2023-11-04 00:16:27 25 4
gpt4 key购买 nike

下面是我输入数字并打印的简单代码。它在 while(1) 循环内,所以我需要“无限次输入数字 - 每次它都会打印数字并再次等待输入”。

#include<stdio.h>
int main()
{
int i;

while(1){
printf("\nenter i \n");
scanf("%d", &i);
if(i==1)
{
printf("%d \n", i);
}
}
return 0;
}

它工作正常。但突然我注意到如果我输入一个字符(例如:“w”)而不是数字,从那里它不会要求输入!!!**它继续打印,

enter i
1
enter i
1
......

当我使用 GDB 调试时,我注意到在输入“w”后,字符“w”的值没有存储在 &i 中。在我输入“w”之前,它有 0x00000001,以便在整个过程中打印“1”。

  1. 为什么它不要求其他输入?据我所知,当我输入“w”时,“w”的ascii值应该存储在&i中。但这并没有发生。

  2. 如果我在 while 循环中放入“int i;”,它就可以正常工作!为什么?

请按以下方式测试我的代码:

  • 复制粘贴并运行
  • 当“enter i”提示出现时输入1
  • 第二次输入“w”。看看会发生什么……

最佳答案

scanf with %d 格式说明符将读取“看起来像数字”的所有内容,即满足严格定义的整数十进制表示格式的内容:一些可选的空格后跟一个可选的符号,然后是一系列数字。一旦它遇到一个不可能是十进制表示的一部分的字符,scanf 就会停止读取并保持输入流中的其余输入数据不变(等待下一个 scanf)。如果您只输入 w,您的 scanf 将找不到任何“看起来像数字”的东西。它什么也不会读。相反,它将通过其返回值报告失败。同时,您的 w 将保留在输入流中,未读。下次您尝试使用 scanf 时,完全相同的事情会再次发生。一次又一次…… w 将永远存在于输入流中,导致您的每个 scanf 调用立即失败并且您的循环永远运行(除非你的未初始化变量 i 碰巧以 1 的值开始它的生命)。

您认为输入w 应该使scanf 读取w 的ASCII 码的假设是完全错误的。这听起来很接近 %c 格式说明符的作用,但这甚至不接近 %d 格式说明符的作用。 %d 不将任意字符读取为 ASCII 码。

另请注意,每次您尝试使用位于输入流中的 w 调用 scanf 时,您的 scanf 都会失败并保留值i 未更改。如果您在循环内声明您的 i,则在每次 scanf 尝试失败后,i 的值将保持未初始化且不可预测。在那种情况下,您的程序的行为是未定义的。它甚至可能会产生一种“工作正常”的错觉(在这种情况下,无论您对此有何理解)。

关于c - 如果我之前输入了某个输入,为什么 scanf() 不等待下一个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25501355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com