如果scanf语句在格式字符串中有任何空格,如下所示,
scanf(" %c",&abc);
然后它只是跳过无限数量的空格,直到它击中一个角色。 所以\ n \ p作为输入将p存储在abc中。
使用此概念,我无法预测我输入的以下程序的输出。
char echo ;
do {
scanf ("%c ", &echo);
printf ("%c\n",echo);
} while (echo != '\n') ;
请注意,scanf语句中有一个尾随空格。
执行代码后,我得到以下行为。 它要求一个角色。我输入C. 它要求一个角色。我进入了我 它打印C. 它要求一个角色。我输入R. 它打印我。 它要求一个角色。我输入C. 它打印R.
这种情况永远存在。如果我按下换行符,那么它就会跳过它。 为什么一开始要求两个字符?它不应该执行printf语句吗? 为什么上一个输入的字符会在下一个输入中打印出来?
在scanf
格式中,空格字符匹配输入中的任何数量的空白区域(空格,制表符和换行符)。
所以你输入C + newline
并没有任何反应,因为scanf
将字符C
与%c
匹配,newline
被空间吃掉。但scanf
将继续,直到它得到不匹配的东西。因此,您可以在此处放置任意数量的空格,制表符和换行符。
当qazxsw poi读取不匹配的内容时,它会调用qazxsw poi将其放回stdin并返回。所以空间将继续匹配,直到你把不同的东西。
这就是为什么当你输入scanf
时,最后一个ungetc(c, stdin)
会返回。然后下一个scanf
执行,它匹配R + newline
与scanf
和换行符与空格。但是空间仍然匹配任何数字空格。当您键入非空白字符时,它将结束。