多项式乘法(ax+b)*(cx+d)输入浮点系数时输出异常咨询
问题分析:输入非整数导致程序异常的原因
首先来看你提供的代码:
#include <stdio.h> int main() { int a, b, c, d; int p2, p1, p0; printf("Enter a:"); scanf("%d",&a); printf("Enter b:"); scanf("%d",&b); printf("Enter c:"); scanf("%d",&c); printf("Enter d:"); scanf("%d",&d); p2 = a*c; p1 = a*d + b*c; p0 = b*d; printf("The product is: %dx^2+%dx+%d\n",p2,p1,p0); return 0; }
执行时的异常输出:
Enter a:1.5
Enter b:Enter c:Enter d:The product is 3x^2+0x+0
核心原因:scanf的整数匹配规则与输入缓冲区残留问题
这里的问题完全出在scanf("%d")的工作机制和你输入的非整数内容不匹配:
- 当你输入
1.5时,scanf("%d", &a)只会读取整数部分1赋值给a,而输入中剩余的.5(包括小数点和数字5)会被留在输入缓冲区中,没有被处理。 - 接下来调用
scanf("%d", &b)时,它会尝试从缓冲区读取下一个整数,但缓冲区的第一个字符是.,这不属于十进制整数的有效字符,导致scanf匹配失败。此时b不会被赋值(它是未初始化的局部变量,值是随机的垃圾值,你的输出里显示为0只是巧合),同时scanf会设置错误状态位。 - 后续的
scanf("%d", &c)和scanf("%d", &d)会因为之前的错误状态直接跳过读取操作,不会等待用户输入,也不会修改c和d的值(同样是未初始化的垃圾值)。 - 最后计算乘积时,使用的是
a=1加上b、c、d的随机垃圾值,你看到的3x^2+0x+0只是某次运行的随机结果,换个环境运行可能会得到不同的数值。
额外说明:为什么提示文本会连在一起?
因为printf("Enter b:")是正常执行的,但紧接着的scanf直接失败,程序不会等待用户输入,就立刻执行下一个printf("Enter c:"),以此类推,所以这些提示文本会连续输出,看起来像是程序没有接收后续输入。
内容的提问来源于stack exchange,提问作者Krishna Kanth Yenumula
相关产品推荐
相关产品推荐

