C语言找零程序变量出现异常值原因排查求助
找零程序异常值问题排查
编写了一个使用重复if语句的找零程序,但输入45时,原本应为0的Nickles和Pennies变量出现极大异常值,实际输出包含错误数值,期望仅输出1 Quarter和2 Dimes。相关代码、输入输出如下:
程序代码
#include <stdio.h> int main(void) { int a; int b; int c; int d; int e; int cha; scanf("%d", &cha); if(cha == 0){ printf("No change\n"); return 0; } if(cha >= 100){ a = cha / 100; cha = cha % 100; } if(100> cha && cha >= 25){ b = cha / 25; cha = cha % 25; } if(25 > cha && cha >= 10){ c = cha / 10; cha = cha % 10; } if(10 > cha && cha >= 5){ d = cha / 5; cha = cha % 5; } if(5 > cha && cha >= 1){ e = cha; } if(a == 1){ printf("%d Dollar\n",a); } if(a > 1){ printf("%d Dollars\n",a); } if(b == 1){ printf("%d Quarter\n",b); } if(b > 1){ printf("%d Quarters\n",b); } if(c == 1){ printf("%d Dime\n",c); } if(c > 1){ printf("%d Dimes\n",c); } if(d == 1){ printf("%d Nickle\n",d); } if(d > 1){ printf("%d Nickles\n",d); } if(e == 1){ printf("%d Penny\n",e); } if(e > 1){ printf("%d Pennies\n",e); } return 0; }
输入示例
45
程序输出
1 Quarter 2 Dimes 875483616 Nickles 32766 Pennies
期望输出
1 Quarter 2 Dimes
问题原因
C语言中,未初始化的局部变量会保留内存空间中的随机垃圾值。输入45时:
- 经过计算,
cha最终变为0,因此d(对应Nickles)和e(对应Pennies)的赋值条件都不会触发,这两个变量始终未被赋值,保留了内存中的随机值。 - 后续输出判断时,这些随机值恰好大于1,导致错误输出了异常的Nickles和Pennies数量。
修复方案
有两种简单的修复方式:
初始化所有变量为0
在声明变量时直接赋值初始值,确保未触发赋值条件的变量默认值为0:int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; int cha;输出前先判断变量是否大于0
在输出每个币种的判断前,先检查变量是否大于0,仅当有对应数量的币种时才输出:
例如针对Nickles的输出修改为:if(d > 0){ if(d == 1){ printf("%d Nickle\n",d); } else { printf("%d Nickles\n",d); } }同理修改Pennies及其他币种的输出逻辑。
内容的提问来源于stack exchange,提问作者Mateuro
相关产品推荐
相关产品推荐

