繁体   English   中英

scanf在要求用户输入之前接受输入的歧义性质?

[英]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);
...
  1. main()使用适当的函数签名-但这不是主要问题。

  2. 代码显示为“ \\ n输入数字1 \\ t”

  3. "%d"指示scanf()通过3个步骤扫描可转换为int文本:
    答:扫描可选的前导空格,例如'\\n''\\t'' ' 把它们丢掉。
    B:扫描代表“ +1234567890”之类的整数的文本。 如果找到任何数字,则将转换后的结果保存到地址&num1
    C:在步骤B中继续扫描,直到找到不属于该intchar char是“未读”的,并返回到stdin

  4. (这是@Chandru所建议的麻烦之处) " "指示scanf()扫描任何数量(0或更多)的空白,包括'\\n''\\t'' '和其他。 然后将它们扔掉-不保存。
    B: 继续扫描!! 直到找到非空格。 char是“未读”的,并返回到stdin

  5. 最后, scanf()返回值1因为这是转换了多少字段说明符。 遗憾的是,代码没有检查该值。

调用stdin通常是行缓冲的,这意味着直到按下Enter键,输入才对用户IO可用。

用户输入1 2 3 Enterscanf()扫描“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM