注册 登录
编程论坛 C++教室

灰常简单的小问题啊谁来解答

dleenig 发布于 2012-10-02 18:28, 602 次点击
时间长不碰C++了,今天突然碰见个小问题,部分程序如下:
 for(i=0;i<10;i++)
      scanf("%d\t",&a[i]);
为什么加了“\t”时需要输入11个数(每次输入完数字后都按的是回车键)才算输入完成,而不加“\t”时刚好是10个数?

[ 本帖最后由 dleenig 于 2012-10-3 16:18 编辑 ]
8 回复
#2
孤独城堡2012-10-02 18:49
还真么遇过这种问题,求解答
#3
lz10919149992012-10-02 23:18
"%d\t"的意思就是一个十进制整数接着是一个制表符,循环10次,则输入的时候要这样输入10次。scanf的用法及格式化字符串的详细知识在baidu上多得很,何必拿到这来问,并且这个应该是C的东西吧?不属于C++。
#4
dleenig2012-10-03 11:39
回复 3楼 lz1091914999
C与C++都用这些字符啊,没必要计较这些,斑竹大哥,解释下为什么第一种情况是11次才是重点……如果您不会的话,可以不回答
#5
dleenig2012-10-03 16:26
我知道了,第11个数实际上是\t的结束标志(不计入总数)最终结果不受影响。
唉,我真笨啊,居然想了一天
#6
lz10919149992012-10-03 21:08
以下是引用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 编辑 ]
#7
pangding2012-10-04 12:17
自己动手丰衣足食。我非常鼓励大家自己找到答案的,寻求解决方法。

楼主知道为什么这类问题大家不太爱答吗?
一是问题比较常见,在网上很容易找到答案。就算是在本论坛搜搜老帖,也有很多。
二是这个问题是细节问题,具体回答起来非常费劲。我们提供一下思路帮助楼主寻找答案的方向会比较容易。
#8
dleenig2012-10-04 18:04
回复 6楼 lz1091914999
版主大爱啊,对不起,我以后好好学习
#9
dleenig2012-10-04 18:12
回复 7楼 pangding
谢谢,知道了,我自学的C语言,还不是很会,希望各版主见谅啊,下次我尽量找不到答案时再问。
1