C语言 scanf格式字符串中的非空白字符



我有一个关于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/ 2010/20完全扫描,但10 /20没有。