看看下面这个吧

xitijie 2011-04-14 10:38:50
#include <stdio.h>
int main()
{
int a=123,b=1;
char c='t';
scanf("%d%d",&a,&b);
scanf("%c",&c);
printf("%d\n%d\n%c\n",a,b,c);
return 0;
}输入:2 回车a 回车
结果是:
2
1
a


为什么?

我自己的想法你们说对不对?

1,2被付给a了;
2,但是接下来是回车与%d不匹配,所以忽略这个scanf的剩余部分
3,%c与刚才输入的回车匹配,所以C是回车

所以我想的结果应该是2,1,回车

对吗?
...全文
336 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
flysnowhite 2011-04-15
  • 打赏
  • 举报
回复
使用C++吧,没有这些输入格式及类型匹配问题。
delphiwcdj 2011-04-15
  • 打赏
  • 举报
回复
The reason is because of 13L. Perhaps maybe one of the more experienced guys can help you out.
delphiwcdj 2011-04-15
  • 打赏
  • 举报
回复


#include <cstdio>
#include <cstdlib>
#include <cctype>

int main()
{
int a = 123, b = 1;
char c = 't';
char ch;

scanf("%d", &a);
scanf("%c", &ch);
if (isspace(ch))
{
printf("%d is a whitespace right ?\n", ch);
}

if (scanf("%d", &b) != 1)
{
printf("Damn it! b cannot read input!\n");
}

scanf("%c", &c);
printf("%d %d %c\n", a, b, c);

system("pause");
return 0;
}
赵4老师 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hhh_hao 的回复:]
可以看看scanf的返回值,
[/Quote]
必须检查scanf的返回值!
jialejiahi 2011-04-15
  • 打赏
  • 举报
回复
纠错
继续缓冲区-->继续扫描缓冲区
jialejiahi 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xitijie 的回复:]

引用 12 楼 delphiwcdj 的回复:

实验了一下,发现当变量a读入成功之后,此时缓冲区中还存留一个'\n',但是当第二次输入非法数据时,缓冲区中的'\n'已经被覆盖了。
上面的代码效果同下:
C/C++ code

#include <stdio.h>
int main()
{
int a=123,b=1;
char c='t';
char ch;

sca……
[/Quote]
12楼没有说被a覆盖了,他的意思是空白(空格,制表,回车)被跳过了。
scanf根据说明符逐个扫描输入的字符。
在你的输入条件下,第一个scanf扫描过程大致如下
第一个%d读取一个整数到a;
第二个%d遇到空白跳过,继续缓冲区,第一个非空白字符是'a',不匹配,跳过%d,a留在缓冲区
下一个scanf遇到%c,缓冲区中是'a',所以把'a'存入c
当你的输入是2空白a时,第一个scanf会把中间的空白字符跳过。
你可以在2和a之间多输入几个回车空格试一下,效果应该是一样的。

xitijie 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 delphiwcdj 的回复:]

实验了一下,发现当变量a读入成功之后,此时缓冲区中还存留一个'\n',但是当第二次输入非法数据时,缓冲区中的'\n'已经被覆盖了。
上面的代码效果同下:
C/C++ code

#include <stdio.h>
int main()
{
int a=123,b=1;
char c='t';
char ch;

scanf("%d",&a);
……
[/Quote]

你就是用一个scanf把第一个回车读走了,你怎么能说是a把回车覆盖了呢?明显不对嘛。。。。帅哥
delphiwcdj 2011-04-14
  • 打赏
  • 举报
回复
原因这里
Whitespace character: the function will read and ignore any whitespace characters (this includes blank spaces and the newline and tab characters) which are encountered before the next non-whitespace character. This includes any quantity of whitespace characters, or none.
delphiwcdj 2011-04-14
  • 打赏
  • 举报
回复
实验了一下,发现当变量a读入成功之后,此时缓冲区中还存留一个'\n',但是当第二次输入非法数据时,缓冲区中的'\n'已经被覆盖了。
上面的代码效果同下:

#include <stdio.h>
int main()
{
int a=123,b=1;
char c='t';
char ch;

scanf("%d",&a);
scanf("%c",&ch);// 显示地读出来
if (scanf("%d",&b) != 1)
{
printf("error\n");
}

scanf("%c",&c);
printf("%d\n%d\n%c\n",a,b,c);
return 0;
}
wuweihuan24 2011-04-14
  • 打赏
  • 举报
回复
你不是初始化了b=1吗?
当你没给它赋值时,它就默认的是b=1;
chenyi00800 2011-04-14
  • 打赏
  • 举报
回复
就像二楼说的那样
xitijie 2011-04-14
  • 打赏
  • 举报
回复
继续等
xitijie 2011-04-14
  • 打赏
  • 举报
回复
没人回答吗???????????


xitijie 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 delphiwcdj 的回复:]
输入:2 回车a 回车
结果是:2 1 a
=======
是因为b指定的是整型输入格式,但是你输入的是一个字符类型,所以b没有读入数据,缓冲区中一直保留着a,直到下面那句,再将a读入到变量c
[/Quote]

但是第一个回车还在缓冲区钟啊!为什么他没有被C读走?
無_1024 2011-04-14
  • 打赏
  • 举报
回复
2楼得解释是对的
pathuang68 2011-04-14
  • 打赏
  • 举报
回复
除了第二部需要参考2楼的回答外,楼主分析得大致不错。
delphiwcdj 2011-04-14
  • 打赏
  • 举报
回复
这样就清楚了

#include <stdio.h>
int main()
{
int a=123,b=1;
char c='t';
while (rewind(stdin), scanf("%d%d",&a,&b) != 2)
{
printf("Bad input, please input again!\n");
}
scanf("%c",&c);
printf("%d\n%d\n%d\n",a,b,c);// 换成%d看清楚是什么
return 0;
}
pathuang68 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 delphiwcdj 的回复:]

输入:2 回车a 回车
结果是:2 1 a
=======
是因为b指定的是整型输入格式,但是你输入的是一个字符类型,所以b没有读入数据,缓冲区中一直保留着a,直到下面那句,再将a读入到变量c
[/Quote]

++
说得好。
delphiwcdj 2011-04-14
  • 打赏
  • 举报
回复
输入:2 回车a 回车
结果是:2 1 a
=======
是因为b指定的是整型输入格式,但是你输入的是一个字符类型,所以b没有读入数据,缓冲区中一直保留着a,直到下面那句,再将a读入到变量c
hhh_hao 2011-04-14
  • 打赏
  • 举报
回复
可以看看scanf的返回值,

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧