作者deepking (wnuiayldh)
看板C_and_CPP
标题[问题] printf会输出多余的东西?
时间Thu Jul 2 01:03:35 2009
int i;
char ch;
double a, b, c, d
for(i=1; i<10; i++){
scanf("%c", &ch);
scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
printf("%c %f %f %f %f\n", ch, a, b, c, d);
}
连输入r 1 2 3 4
第一次输出完後
会多印出一行空白
并且又多印一次1 2 3 4(没有r)
找很久还是不知道错在那?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.122.32.152
1F:推 ledia:ch 会抓到换行字元 07/02 01:04
ch抓到\n所以印出空白行
不懂为什麽印出1 2 3 4
r怎麽没被a给读走@@?
※ 编辑: deepking 来自: 122.122.32.152 (07/02 01:18)
2F:→ weiyucsie:你要不要多印个i来看看? 07/02 01:23
3F:→ weiyucsie:因为我猜你第二次的1 2 3 4是i=2的情况 07/02 01:24
4F:推 sinsendo:你每次按下的所有东西,都会存放在一个缓冲区, 07/02 01:25
5F:→ weiyucsie:因为第二次scanf我猜没读到东西,用旧的数值 07/02 01:26
6F:推 VictorTom:在windows下吧, 会有\r\n两个换行字元在stdin内.... 07/02 01:26
7F:→ sinsendo:包含空白与按下的Enter,scanf在读入东西的时候, 07/02 01:27
8F:→ sinsendo:除了符合输入类型的东西,剩下都会放回缓冲区, 07/02 01:28
9F:→ sinsendo:所以如果先scanf("%d", x);键入5,x的值为5, 07/02 01:29
10F:→ sinsendo:但是按下5之後还按了Enter,因此总共输入了两样东西, 07/02 01:31
11F:→ sinsendo:一个是5,後面那个是\n,因此再scanf("%c", ch); 07/02 01:32
12F:→ sinsendo:就会读到那个\n,ch里面装的是换行符号! 07/02 01:34
13F:→ sinsendo:我讲的很草率,不知道有没有帮到你... (默 07/02 01:34
14F:→ sinsendo:有请高手补完... (逃 07/02 01:34
15F:→ deepking:谢谢大家^^,还在想接下来abcd怎没读到东西?是因为\r\n? 07/02 01:39
16F:→ deepking:大大讲得很详细了@@ 唤醒久远的记忆... 07/02 01:43
17F:推 ledia:ch 先读到 \n, 那个 r 还在 buffer 里, 之後的 %lf 读不到 07/02 10:53
18F:→ ledia:scanf 有传回值, 传回他确实收到多少个输入, 印出来看看 07/02 10:53
19F:→ ledia:就会知道发生什麽事了 07/02 10:53
20F:→ deepking:恩,总算懂了,现在用sscanf,方便多了! 07/02 20:44