scanf在被要求从用户输入之前获取输入的模糊性质?

时间:2014-11-01 10:02:30

标签: c gcc printf scanf

#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;
}

我想知道原因。请提供。

上面的代码接受两个输入,第一个输入被询问(通过执行第1行)然后用户输入一个数字然后终端应该要求输入第二个输入但是它正在接受其他数字(在执行第2行之前)然后要求输入第二个输入(即在执行第2行之后)。

结束是显示执行第二行之前采取的两个输入 执行第一行之后的

我很困惑。我有兴趣知道原因。 我在ubuntu 14.04 64位机器上使用 GCC 4.8.2。

5 个答案:

答案 0 :(得分:3)

删除访问说明符的scanf之间的空格。

scanf("%d ",&num1);

scanf("%d",&num1);

因为scanf因空格而获得另一个值。

并保留在缓冲区中。内存到达后,它被分配。

适用于所有scanf功能。

如果我输入

Enter Number1     1
2

Entered number is 1

Enter number2     3

Entered number is 2.

答案 1 :(得分: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;
}

以下是Demo.

答案 2 :(得分:1)

你需要把

 fflush(stdout);
scanf

之前

这将刷新缓冲区

(也是检查scanf

的返回值的好主意

答案 3 :(得分:1)

您在scanf中为%d提供了空格。如果在%d之后删除该空格,程序将运行

答案 4 :(得分:0)

让我们慢慢分开

#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. 代码打印&#34; \ n输入数字1 \ t&#34;

  3. "%d"指示scanf()分三步扫描可转换为int的文字:
    答:扫描可选的前导空格,例如'\n''\t'' '。扔掉它们。
    B:扫描表示类似&#34; + 1234567890&#34;的整数的文本。如果找到任何数字,请将转换后的结果保存到地址&num1 C:在步骤B中继续扫描,直到找到不属于char的{​​{1}}。那int是&#34;未读&#34;并返回char

  4. (这是@Chandru建议您遇到麻烦的地方)stdin指示" "扫描任意数量(0个或更多)的空格,包括scanf()'\n''\t'和其他人。然后他们被扔掉了 - 没有得救 B:扫描继续 !!直到找到非白色空间。那' '是&#34;未读&#34;并返回char

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

  6. 召回1通常是行缓冲的,这意味着在 Enter 被击中之前,用户IO无法使用输入。

    用户输入 1 2 3 输入stdin扫描&#34; 123& #34;并将scanf()保存到123。然后它扫描&#34; \ n&#34;因为这是步骤4中的空格。并继续等待更多的空白

    用户输入 4 5 6 输入和尚未完成的第一个&num1 ,扫描scanf(),看到它不是空格并将'4'放回'4'。输入2行后,stdin最终返回。此时&#34; 456 \ n&#34;正在scanf()等待后续stdio

    第二个scanf()然后使问题永久化。

    建议仅对所有用户输入使用scanf(),至少在您熟练使用C之前。

    fgets()