输入字符串/特殊字符时,3位Armstrong数判定程序误判问题咨询
输入非数字时程序误判为Armstrong数的原因分析
先看你提供的判定3位Armstrong数的C语言代码:
#include <stdio.h> #include <stdlib.h> int main() { int a, original, rev, rem; printf("Enter the number : \n"); scanf("%d", &a); original = a; rev = 0; while (a != 0) { rem = a % 10; rev = rev + (rem * rem * rem); a /= 10; } if (rev == original) { printf("Its an Armstrong number\n"); } else { printf("Its not an Armstrong number \n"); } }
出现误判的核心原因如下:
scanf匹配失败时的变量值问题
当输入字符串、特殊字符这类非整数内容时,scanf("%d", &a)无法完成整数格式的匹配,此时变量a的值不会被修改。而a是未初始化的局部变量,它的初始值是栈内存里的随机垃圾值。未校验输入是否有效
程序完全没检查scanf的返回值,不知道输入已经失败,直接继续执行后续的Armstrong数判定逻辑。
最常见的误判场景是:如果a的初始垃圾值恰好是0,那么while(a != 0)循环根本不会运行,rev保持初始的0值,此时rev == original(0等于0)的条件成立,程序就会错误输出“是Armstrong数”。哪怕a的垃圾值非0,也存在小概率情况让循环计算后的rev等于original,导致误判。
内容的提问来源于stack exchange,提问作者Harshil Zahran
相关产品推荐
相关产品推荐

