scanf的异常行为

时间:2010-02-10 04:02:56

标签: c scanf

想知道所有关于C的问题,你能否揭开这个神秘面纱

我正在使用turbo C

我有这段代码

scanf(“%d , %d”,&a,&b);
printf(“%d,%d”,a,b);
scanf(”%c”,&c);
printf(“%d,%d”,a,b);

然后scanf表示c

的不扫描值

输出为:1,2

如果我使用这个

scanf(“%d , %d”,&a,&b);
printf(“%d,%d”,a,b);
scanf(”%c ”,&c);//note a blank after %c
printf(“%d,%d”,a,b);

然后它扫描c的值。

输出为1,2 1,2

相同的代码

scanf(“%d , %d”,&a,&b);
printf(“%d,%d”,a,b);
scanf(”%1s”,&c);
printf(“%d,%d”,a,b);

在此段中将显示a的值,但b的值将设置为0

输出为1,2 1,0

你能解释这两个问题的答案。

没有得到答案,但帮助我.......

2 个答案:

答案 0 :(得分:3)

在你的最后一种情况下,它与在内存中设置值的位置有关。

第二个scanf将长度为1的字符串放在c的地址处 - 即一个字符,后跟空终止符。

猜猜空终止符在哪里?

答案 1 :(得分:1)

你怎么知道在第一种情况下没有为c扫描角色?我认为这是因为你提供了一个不受禁止的打印声明而且看不到任何内容。

仔细阅读手册页,注意%c说明符的行为:

  

Ç
       匹配一系列宽度计数字符(默认值为1);下一个              指针必须是指向char的指针,并且必须有足够的空间              对于所有字符(不添加终止NUL)。 通常              跳过前导空格被抑制。要跳过空白区域              首先,使用格式的显式空格。

[强调补充]

如果您输入的内容为1, 2 a,则第一次扫描会占用1 , 2并离开a,此时第二次扫描会占用空间 。在这种情况下,不确定第二个例子 的工作原理。

Anon. is on the money about the third case.