How does C treat trailing spaces in scanf?
如果scanf语句在格式字符串中有任何空格,如下所示:
然后它跳过无限多的空格,直到碰到一个字符。因此 p作为输入将p存储在abc中。
使用这个概念,我无法预测我输入的以下程序的输出。
1 2 3 4 5 6 7
| char echo ;
do {
scanf ("%c", &echo );
printf ("%c
",echo );
} while (echo != '
') ; |
号
注意scanf语句中有一个尾随空格。
代码执行后,我得到以下行为。它要求一个角色。我输入c它要求一个角色。我输入i它打印C。它要求一个角色。我输入r它打印了我。它要求一个角色。我输入c它打印R。
这会一直持续下去。如果我按newline,它就会跳过它。为什么开头要求两个字符?它不应该执行printf语句吗?为什么前一个输入的字符会在下一个输入中打印?
- 你找到所有的"%c"Whitespace尾随。等待,直到它的一些非Whitespace是发现。你有发现的,它是坏主意。
- "如果有兴有OS是不是白色的空间,那么它将"等待"白色空间?
- 我给你你如何取得你的代码对应于描述的行为。我看到在所要求的字符代码。
- EOF的scanf语句"吗?
- 在分型abcd然后按下回车键。
- 什么是可能的副本的空间效应和尾白)scanf(格式字符串中?
- "smarthbansal scanf()扫描输入。它不让它。
- "我看你的EOF的均方根。它要求对我说,这是该字符的用户平均等待进入的东西。
- "它要求个性"如何?在scanf()右printf("
==>"); fflush(stdout);吗?试试。
- 不是我不明白"的消费者。它明确要求输入?
- 而不是简单的blinking光标输入提示符,试试我的建议。
- PMG哇@!谢谢,你解决我的问题!summarizing:它只检查非白人在我按下回车键后输入的执行。如果它没有找到任何T,然后等待它的下一个输入。好吗?
- 一种……scanf("%c", &ch);读取跳过一个或更多的字符与Whitespace 0。"你3enter型"和你在一起ignoring Whitespace scanf()仍在。你进入型(标签,一些更多的空间)和你在一起scanf()还在里面。最后,当你scanf()型",有7enter")("7enter ignoring Whitespace离开,"你的程序的输入缓冲区)。
- PMG谢谢@!我应该删除这一问题吗?现在我明白了它是如何worded难。
在scanf格式中,空格字符与输入中任何数量的空白(空格、制表符和换行符)匹配。
所以你进入C + newline,什么也没有发生,因为scanf与C和%c匹配,newline被空间吞噬。但是scanf会一直持续到它得到不匹配的东西为止。所以您可以在这里放置任意数量的空格、制表符和换行符。
当scanf读到不匹配的东西时,它调用ungetc(c, stdin)把它放回stdin并返回。所以空间将继续匹配,直到放置不同的内容。
这就是当您键入R + newline时,最后一个scanf返回的原因。然后执行下一个scanf,它将R与%c匹配,将换行符与空格匹配。但是空间仍然匹配任何数字的空白。它将在键入非空白字符时结束。