这两段代码之间有什么区别:
1
scanf("%d%d", p1, p2);
2
scanf("%d", p1);
scanf("%d", p2);
答案 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规范。