我有一个关于scanf函数在遇到格式字符串中的非空白字符时所采取的过程的问题。根据我正在读的书:
当
scanf
函数遇到格式字符串中的非空白字符时,scanf
将其与下一个输入字符进行比较。如果两个字符匹配,则scanf
丢弃输入字符并继续处理格式字符串。如果字符不匹配,scanf
将有问题的字符放回输入,然后中止,不进一步处理格式字符串或从输入中读取字符。
我有点困惑。它说scanf
将它与下一个输入字符进行比较,如果两个字符匹配,scanf
丢弃输入字符。为什么我们说它与"下一个"相比?输入字符?
这是否意味着如果我们有一个像scanf("%d/%d", &x, &y)
和输入的2/4
比较,scanf
与四个比较,因为它是/
?
描述scanf
的另一种方式是,对于非空白字符,它将在格式字符串中看到的内容跟随输入。但是,如果它找到了一个不同的阅读器,它就会"unreads"。然后停止扫描。
例如:
int x, y;
int scanned = scanf("%dabc%d", &x, &y);
如果我们给它输入10abc20
,那么它的操作顺序是:
- 到达
%d
,读取10
,保存在x
中 - 一个接一个地读取
abc
,然后跟随格式字符串中给定的abc
。 - 到达
%d
,读取20
,存储在y
。 - 到达格式字符串的末尾,扫描两个值返回值
2
。 - 离开代码,所有输入的字符都被消耗。
给出相同的程序10abz20
:
- 到达
%d
,读取10
,保存在x
中 - 它正确读取
ab
,但当它到达z
时,将该字符解读,并提前返回值1
,因为它只扫描了第一个数字。 - 离开代码,
z20
未被读取,可以在程序稍后读取。
所以在您的示例scanf("%d/%d", &x, &y)
中,输入10/20
将完全扫描,但10d20
只会将10
扫描到x,而将d20
未读。顺便说一句,10/ 20
和10/20
完全扫描,但10 /20
没有。