c语言程序 输入字母就会溢出,怎么解决? 小弟新手

meihao3601 2010-10-17 09:48:18
#include <stdio.h>

void main()
{
int a,b,sum;
int i=1;
while(i=1)
{
scanf("%d %d",&a,&b);
sum=a+b;
printf("%d\n",sum);
}
}
...全文
236 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiumingAE86 2012-08-22
  • 打赏
  • 举报
回复
C++的cin怎么解决
meihao3601 2010-10-17
  • 打赏
  • 举报
回复
#include <stdio.h>

void main()
{
int a,b,sum,r;
int i=1;
while(i=1)
{
scanf("%d %d",&a,&b);
if((r=scanf("%d %d",&a,&b) != 2)
{
break;
}
sum=a+b;
printf("%d\n",sum);
}
}

这样是输入两遍才会输出结果的代码,结果是第二次输入的数相加,这个我理解是因为最终赋值的是第二次输入,那么为什么我第一次输入的字符时候他就直接退出,而不等我第二次输入了?第一次输入也作为判断条件了?
meihao3601 2010-10-17
  • 打赏
  • 举报
回复
现在明白了,刚才输两遍是应为我没有删除原来的scanf函数,所以要输入两遍
meihao3601 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 eclipse_2 的回复:]
我刚才测试了一下 一遍即可
我的编辑器是GCC
[/Quote]
我用的vs2010,重新输入进去也是需要两遍,或者中间打两个空格,有点不明白了
某某9 2010-10-17
  • 打赏
  • 举报
回复
int不会转换为char
但是反之可以
sky198306 2010-10-17
  • 打赏
  • 举报
回复
int 不会自动把char转化为其数字,需要手动识辨转换
大牛~Daniel 2010-10-17
  • 打赏
  • 举报
回复
关注,遇到过相同的问题!但是自己没太在意!
因为int 输入 char 肯定是不合理的,所以就没考虑过了!
小魔菇 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 meihao3601 的回复:]

加上对返回值的判断后就需要输入两遍才输出结果了,这是为什么?
[/Quote]
我刚才测试了一下 一遍即可
我的编辑器是GCC
meihao3601 2010-10-17
  • 打赏
  • 举报
回复
加上对返回值的判断后就需要输入两遍才输出结果了,这是为什么?
小魔菇 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 meihao3601 的回复:]

引用 2 楼 eclipse_2 的回复:
引用 1 楼 eclipse_2 的回复:

scanf("%d %d",&amp;amp;a,&amp;amp;b);
把里面的空格去掉
改成 scanf("%d%d",&amp;amp;a,&amp;amp;b);

你格式中是%d 但是你输入的是char 格式不对
加上对scanf的返回值进行一下判……
[/Quote]

scanf并不友好 需要程序员对输入是否正确进行判断

至于为什么会死循环 我也不知道 对scanf函数只会用 没研究
期待高手解决一下
meihao3601 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 eclipse_2 的回复:]
引用 1 楼 eclipse_2 的回复:

scanf("%d %d",&amp;a,&amp;b);
把里面的空格去掉
改成 scanf("%d%d",&amp;a,&amp;b);

你格式中是%d 但是你输入的是char 格式不对
加上对scanf的返回值进行一下判断吧

C/C++ code

int ret;
if((ret = ……
[/Quote]
那么为什么输入字母之后,它会无限输出呢?不会转换为ASCII码十进制吗?
小魔菇 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 eclipse_2 的回复:]

scanf("%d %d",&a,&b);
把里面的空格去掉
改成 scanf("%d%d",&a,&b);
[/Quote]
你格式中是%d 但是你输入的是char 格式不对
加上对scanf的返回值进行一下判断吧

int ret;
if((ret = scanf("%d%d",&a,&b)) != 2)
{
break;
}
小魔菇 2010-10-17
  • 打赏
  • 举报
回复
scanf("%d %d",&a,&b);
把里面的空格去掉
改成 scanf("%d%d",&a,&b);
小魔菇 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jznhljg 的回复:]

引用 3 楼 meihao3601 的回复:

那么为什么输入字母之后,它会无限输出呢?不会转换为ASCII码十进制吗?


scanf有两种失败情况:一种是输入失败, 另一种是匹配失败。

c标准中说: 如果转换因为一个无法识别的输入字符而终止,那么这个输入字符留在输入流中不被读取。

所以,在scanf("%d %d",&a,&b);执行的时候,如果你输入字……
[/Quote]
原来如此 学习了
jznhljg 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 meihao3601 的回复:]

那么为什么输入字母之后,它会无限输出呢?不会转换为ASCII码十进制吗?
[/Quote]

scanf有两种失败情况:一种是输入失败, 另一种是匹配失败。

c标准中说: 如果转换因为一个无法识别的输入字符而终止,那么这个输入字符留在输入流中不被读取

所以,在scanf("%d %d",&a,&b);执行的时候,如果你输入字母,比如说
3 d

系统并不会把这个字母(d) 对应的值赋给变量b,而是只完成了前部分的赋a的值为3. 这个“d"还在stdin中,没有被读取。

接下来,就很正常的进行打印sum的值 ,然后循环,当再再次运行到scanf("%d %d",&a,&b);的时候,stdin流中还留着上次未能读取的"d", 因此,它并不会等你再次输入,而是像上次一样的跳过这个“d",不进行处理。
很显然,现在再打印sum的值,还是第一次的sum值,并没有变化。

然后。。就是重复上面的过程了。不停的跳过stdin里面的那个“d",也就是不给你再次输入的机会,一如既往的打印第一次的sum值。

整个过程就是这样了。

其实这不是个溢出问题,而是scanf函数的实现问题。甚至不知道能不能说这是个问题,标准里面明明写着的,只是没注意到而已。 楼主可以gdb调试一下,用x/4xb address; 打印上面变量的值看看就一清二楚了。

70,009

社区成员

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

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