当输入不是指定格式时,scanf()如何读取?

时间:2015-01-15 10:43:05

标签: c

以下程序的输入和输出如下:

#include<stdio.h>
int main(){
int a=0, b=100, c=200;
scanf("%d,%d,%d",&a,&b,&c);
printf("%d %d %d\n",a,b,c);
return 0;
}

输入-1:

1,2,3

输出-1:

1 2 3

所以第一个输出是正确的,正如预期的那样。

输入-2:

1 2 3

输出-2:

1 100 200

这里它正确地读取了第一个整数但是我无法理解,当我们没有以指定格式给出输入时,scanf()如何在第一个整数之后读取数据?

由于在第一个整数之后输入的值未分配给任何变量,这些值会发生什么变化?

它们是写在一些随机存储位置上的吗?

2 个答案:

答案 0 :(得分:6)

  

这里它正确读取第一个整数,但我无法理解,   当我们不是时,scanf()如何在第一个整数之后读取数据   以指定格式提供输入?

scanf在第一个不匹配时停止,并保持其余目标对象不变。您可以检查返回值以确定“scanf匹配的”项目数。

  

由于在第一个整数之后输入的值未分配给任何值   变量,这些值会发生什么变化?

不匹配的数据保留在输入缓冲区中,可以使用scanffgets等进行后续读取。


  

我在最后一个printf()语句之后使用了getchar()和putchar()   程序但没有读过。

奇怪。你应该能够逃脱:

int ch;
while ((ch = getc(stdin)) != EOF)
    putchar(ch);

答案 1 :(得分:3)

TL; DR回答:事实并非如此。它停止阅读。

为了澄清,input is not in specified formatscanf()匹配失败。这就是为什么始终建议检查scanf()的返回值,以确保所有 所有成功扫描的输入项。

在第二个输入方案中,scanf()无法扫描所有输入参数,因为期望收到<的格式不匹配/ em>输入[你根本不知道]。只有a的值已成功扫描并反映出来。

[仅为了答案的完整性]:

输入值a后,由于输入中没有,,发生了不匹配,scanf()停止了扫描,返回值1。这就是为什么bc打印出它们的初始值。