You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多项式乘法(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:55:03