c - printf 在 scanf 之后不打印正确的值(例如 5 打印为 6618624)
问题描述
我写了一个使用函数的简单计算器。
#include<stdio.h>
void operation_menu();
int getNumber(int,int);
int sum(int,int);
int diff(int,int);
int mult(int,int);
double quot(double,int);
int choice,num1,num2;
int main(){
getNumber(num1,num2);
operation_menu();
return 0;
}
int 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);
}
void operation_menu(){
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(choice){
case 1:
printf("The sum of %d and %d is %d.", num1,num2,sum(num1, num2));
break;
case 2:
printf("The difference of %d and %d is %d.", num1,num2,diff(num1, num2));
break;
case 3:
printf("The product of %d and %d is %d.", num1,num2,mult(num1, num2));
break;
case 4:
printf("The quotient of %d and %d is %.2lf.", num1,num2,quot(num1, num2));
break;
default:
printf("Please try again.");
}
}
int sum(int num1,int num2){
int answer;
answer=num1+num2;
return answer;
}
int diff(int num1,int num2){
int answer;
answer=num1-num2;
return answer;
}
int mult(int num1,int num2){
int answer;
answer=num1*num2;
return answer;
}
double quot(double num1,int num2){
double answer;
answer=num1/num2;
return answer;
}
该程序正常工作,没有将我的 main() 分解为几个较小的函数,但是在为每个操作、输入和菜单创建函数之后,我收到了错误的输出。我通过在使用 scanf 后打印 num1 和 num2 来解决这个问题,果然,我得到了错误的输出。
解决方案
该函数getNumber
更改其局部变量(参数)num1 和num2。退出函数后,这些局部变量不再存在。同名的全局变量保持不变。
您需要通过指向它们的指针通过引用来传递全局变量。例如
int 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);
}
该函数被称为
getNumber( &num1, &num2 );
请注意,不需要将变量 num1、num2 和choice 声明为全局变量。您应该在使用它们的范围内声明它们,例如在函数operation_menu
中。
函数 quot 的两个参数也应该具有类型int
。该函数可以定义为
double quot( int num1,int num2){
double answer;
answer = ( double )num1/num2;
return answer;
}
推荐阅读
- ruby - 我对我的一些 rubygem 代码有疑问
- c# - Smartsheet API 在日期列中设置文本
- java - 如何在资产文件夹中显示来自 sqlite 数据库的数据?
- git - 当我推送到远程时出现权限被拒绝错误(请确保您具有正确的访问权限并且存储库存在)
- javascript - 动态查询谷歌表格中的范围
- node.js - 将 MongoDb 从 cloud9 复制到 Mlab,新文档以奇数顺序保存到 DB
- node.js - 通过函数检查 Json 字段是否为 Null 或不存在
- javascript - 使提交按钮也发送一个额外的值
- reporting-services - TFS 构建服务器因 Reporting Services 项目而失败
- mysql - 无法从 Intellij 连接到在 docker 容器中运行的 mySql - “指定的数据库用户/密码组合被拒绝”