两种使用scanf的方式之间的区别

时间:2014-03-31 16:55:45

标签: c scanf

这两段代码之间有什么区别:

1

scanf("%d%d", p1, p2);

2

scanf("%d", p1); 
scanf("%d", p2);

4 个答案:

答案 0 :(得分:4)

由于您没有检查返回值,因此行为没有区别。如果您正在检查返回值,则第二个选项可能会为您提供更多详细信息(要检查两个返回值)以进行更多工作。如果输入是单个数字后跟EOF,则第二个将返回1,EOF。如果输入是单个数字后跟非数字,则返回1,0。在上述任何一种情况下,第一个选项都会返回1,所以如果没有其他电话,你就无法区分(如果你愿意的话)。

答案 1 :(得分:1)

我发布这个是因为它有助于您以不同的方式使用scanf ::

如果你输入像::

在所有输入下面采用不同的变量和数组

8 5

2 3 1 2 3 2 3 3

0 2

0 1

6 7

3 5

0 7

然后如何使用scanf

如果你想从控制台获取输入作为“空格分隔输入”ex :: 1 2 3 4 5 5 6

然后您可以使用scanf(),如下所示

for(i = 0; i< no_you_want; i ++)

{

//在scanf函数下面的%d之前的单个空格

scanf(“%d”,& a [i]);

}

答案 2 :(得分:0)

首先你需要添加'&'在你的输入;-)像克里斯提到的,除非你处理返回值,否则在工作上没有区别。我试图比较汇编代码,当然还有几个额外的指令如下。

scanf("%d%d", &p1, &p2);

main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16 
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movl    $.LC0, %eax
        leaq    -4(%rbp), %rdx
        leaq    -8(%rbp), %rcx
        movq    %rcx, %rsi
        movq    %rax, %rdi
        movl    $0, %eax
        call    __isoc99_scanf
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret 
        .cfi_endproc

scanf("%d", &p1); 
scanf("%d", &p2);

main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16 
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movl    $.LC0, %eax
        leaq    -8(%rbp), %rdx
        movq    %rdx, %rsi
        movq    %rax, %rdi
        movl    $0, %eax
        call    __isoc99_scanf
        movl    $.LC0, %eax
        leaq    -4(%rbp), %rdx
        movq    %rdx, %rsi
        movq    %rax, %rdi
        movl    $0, %eax
        call    __isoc99_scanf
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret 
        .cfi_endproc

答案 3 :(得分:0)

当输入文字为scanf("%d%d", p1, p2);时,会出现scanf("%d", p1); scanf("%d", p2);"-+2\n"之间的预期差异。

使用scanf("%d%d", p1, p2);scanf()读取"-+"并发现它不是有效的int序列,请为后续IO取消+*p1*p2保持不变。

使用scanf("%d", p1);scanf()阅读"-+"并发现它不是有效的int序列,(*p1保持不变)取消{{1}后续IO +扫描scanf("%d", p2);,将"+3\n"保存到3,并为后续IO取消*p2

  

C11dr§7.21.6.2关于\n的9脚注,适用于fscanf():“fscanf 将最多一个输入字符推回到输入流。因此,有些strtod,strtol等可接受的序列对于fscanf是不可接受的。

但我不能在我的机器上有所不同。

我的cygwin Kepler gcc意外地推回两个 scanf(),导致两个代码都运行相同。你的旅费可能会改变。我的gcc似乎不符合C规范。