以下是引用dleenig在2012-10-3 11:39:14的发言:
C与C++都用这些字符啊,没必要计较这些,斑竹大哥,解释下为什么第一种情况是11次才是重点……如果您不会的话,可以不回答
scanf格式字符串中如果有空白字符(空格,\t,\n等),则代表在下一个输入项之前跳过任意个空白字符,当然包括没有空白字符的情况。
假设使用scanf("%d\t");输入:
123(回车)
这里程序依然处于阻塞状态,不管你敲多少个回车都一样,因为最后那个\t代表之后还有一个输入项,也就是还没遇到一个非空白字符,单单敲一个回车只会在输入缓冲区中增加一个'\n',但因为\t的原因马上就被跳过了,当然你输入任何一个非空白字符,则阻塞将结束(也就是scanf返回了),但你输入的这个字符还在缓冲区里(哦还有一个'\n'),下次调用scanf的时候将从这里开始扫描(也被称作缓冲区中的残留),VC6可以用fflush(stdin)来清理掉,但这并不是标准的解决办法,最好用:
char ch;
while ((ch = getchar()) != '\n' && ch != EOF) ;
来清理,fflush(stdin)似乎只能在VC6里用,其它地方使用的行为都是undefined。当然如果你之后不再使用scanf那么上面说的这些就没必要。
当然楼主把这个\t称为"结束标志",这样也没错,不过"不计入总数"就有问题了,格式化字符串中只有一个%则代表只会输入一个项,其它的只不过是匹配之后丢掉而已。
另外说一点,C++是使用cin来输入的,不是scanf,scanf这个函数是C标准库里的,之所以在C++里也能用,只不过是因为向下兼容而已。
还有些新手朋友遇到的问题是scanf("%d\n");的问题,这种情况跟楼主的一样。
[
本帖最后由 lz1091914999 于 2012-10-3 21:09 编辑 ]