[英]Ambigious nature of scanf taking input before it is asked to enter from user?
#include<stdio.h>
void main(){
int num1,num2;
printf("\n Enter number 1 \t "); // Ask for input one. >>>>>>>> line 1.
scanf("%d ",&num1);
printf("\n Entered number is %d \n",num1);
printf("\n Enter number 2 \t "); // Ask for input Two. >>>>>>>>> line 2.
scanf("%d ",&num2);
printf("\n Entered number is %d \n",num2);
return;
}
我想知道REASON 。请务必提供。
上面的代码接受两个输入,第一个输入被要求(通过执行第1行),然后用户输入一个数字,然后终端应要求输入第二个输入,但是(在执行第2行之前)它取了另一个数字,然后要求输入第二个输入 (即执行第2行之后)。
最后显示正在执行第二行之前但执行第一行之后 的两个输入 。
我很困惑,我很想知道原因。 我在ubuntu 14.04 64位计算机上使用GCC 4.8.2。
删除访问说明符的scanf之间的空格。
scanf("%d ",&num1);
至
scanf("%d",&num1);
因为scanf由于该空格而获得另一个值。
并保存在缓冲区中。 内存获取后,将对其进行分配。
适用于所有scanf函数。
如果我输入像
Enter Number1 1
2
Entered number is 1
Enter number2 3
Entered number is 2.
int main()
,最后写入return 0;
fflush(stdout);
刷新缓冲区。 编辑后,这里是最终代码
#include<stdio.h>
int main(){
int num1,num2;
printf("\n Enter number 1 \t "); // Ask for input one. >>>>>>>> line 1.
scanf("%d ",&num1);
printf("\n Entered number is %d \n",num1);
printf("\n Enter number 2 \t "); // Ask for input Two. >>>>>>>>> line 2.
fflush(stdout);
scanf("%d ",&num2);
printf("\n Entered number is %d \n",num2);
return 0;
}
这是演示。
你需要放
fflush(stdout);
在scanf
之前
这将刷新您的缓冲区
(检查scanf
的返回值也是一个好主意)
您已在scanf中为%d提供了一个空格。 如果您在%d之后删除该空间,程序将运行
让我们慢慢地分开
#include <stdio.h>
// void main(){
int main(void) {
int num1, num2;
printf("\n Enter number 1 \t ");
scanf("%d ",&num1);
printf("\n Entered number is %d \n",num1);
...
为main()
使用适当的函数签名-但这不是主要问题。
代码显示为“ \\ n输入数字1 \\ t”
"%d"
指示scanf()
通过3个步骤扫描可转换为int
文本:
答:扫描可选的前导空格,例如'\\n'
, '\\t'
, ' '
。 把它们丢掉。
B:扫描代表“ +1234567890”之类的整数的文本。 如果找到任何数字,则将转换后的结果保存到地址&num1
。
C:在步骤B中继续扫描,直到找到不属于该int
的char
。 该char
是“未读”的,并返回到stdin
。
(这是@Chandru所建议的麻烦之处) " "
指示scanf()
扫描任何数量(0或更多)的空白,包括'\\n'
, '\\t'
, ' '
和其他。 然后将它们扔掉-不保存。
B: 继续扫描!! 直到找到非空格。 该char
是“未读”的,并返回到stdin
。
最后, scanf()
返回值1
因为这是转换了多少字段说明符。 遗憾的是,代码没有检查该值。
调用stdin
通常是行缓冲的,这意味着直到按下Enter键,输入才对用户IO可用。
用户输入1 2 3 Enter , scanf()
扫描“ 123”并将123
保存到&num1
。 然后,它扫描“ \\ n”,因为这是步骤4中的空白 。 它继续等待更多的空白 。
用户输入4 5 6 输入 ,第一个尚未完成的scanf()
进行扫描,扫描'4'
,看到它不是空格,然后将'4'
放回stdin
。 输入两行后, scanf()
最终返回。 此时,“ 456 \\ n”正在stdio
中等待后续的scanf()
。
然后,第二个scanf()
使问题永久存在。
建议仅将fgets()
用于所有用户输入,至少直到您精通C语言为止。
printf("\n Enter number 1 \t ");
char buf[100];
fgets(buf, sizeof buf, stdin);
if (sscanf(buf, "%d", &num1) != 1) Handle_BadInput();
else printf("\n Entered number is %d \n",num1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.