C语言scanf执行后printf输出错误(如输入5输出6618624)问题问询
问题根源
数值读取错误是两个叠加问题导致的:
- 全局变量
num1、num2被getNumber的同名形参屏蔽:函数内部操作的&num1、&num2是形参(局部变量)的地址,根本没有修改全局的num1、num2,全局变量一直保持初始的随机值,后续运算自然出错。 - C语言默认是值传递:就算没有定义同名全局变量,直接把
num1、num2作为值传入函数,修改的也只是函数栈上的临时副本,不会影响外部的变量。
修复方案
下面给出两种常用修复方式,按需选择即可:
方案1:简化全局变量用法(改动最小)
既然已经定义了全局的num1、num2,直接删掉getNumber的形参即可,不需要传参:
// 1. 修改函数声明,去掉形参 void getNumber(); int main(){ getNumber(); // 调用也不用传参 operation_menu(); return 0; } // 2. 函数定义去掉形参,直接操作全局变量 void getNumber(){ printf("Welcome to Simple Calculator!\n"); printf("Please input a number to begin:\n"); scanf("%d", &num1); printf("Great! Now input the second number:\n"); scanf("%d", &num2); }
方案2:去掉全局变量,用指针传参(更规范的写法)
全局变量容易出现命名冲突、逻辑混乱的问题,更推荐用指针传递地址,直接修改外部变量:
// 删掉全局的num1、num2定义 void operation_menu(int num1, int num2); // 形参改为int*指针类型 void getNumber(int* num1, int* num2); int main(){ int num1, num2; // 改为main函数内的局部变量 getNumber(&num1, &num2); // 传入变量地址 operation_menu(num1, num2); return 0; } void getNumber(int* num1, int* num2){ printf("Welcome to Simple Calculator!\n"); printf("Please input a number to begin:\n"); // 直接对传入的地址对应的内存赋值,修改外部变量 scanf("%d", num1); printf("Great! Now input the second number:\n"); scanf("%d", num2); } // operation_menu也改成接收参数,不用全局变量 void operation_menu(int num1, int num2){ int choice; printf("Select an operation: \n"); printf("1. Addition\n"); printf("2. Subtraction\n"); printf("3. Multiplication\n"); printf("4. Division\n"); scanf("%d", &choice); // 后面的switch逻辑保持原有写法即可 }
额外优化建议
当前的除法逻辑没有做除数为0的判断,用户输入第二个数为0时会出现运行崩溃,可以在运算前加判断:
case 4: if(num2 == 0){ printf("Error: divisor cannot be zero."); }else{ printf("The quotient of %d and %d is %.2lf.", num1,num2,quot(num1, num2)); } break;
内容的提问来源于stack exchange,提问作者Lapnesnoj
相关产品推荐
相关产品推荐

