【问题标题】:Printf does not print the correct values after scanf (ex. 5 is printed as 6618624)printf 在 scanf 之后不打印正确的值(例如 5 打印为 6618624)
【发布时间】:2021-12-15 22:50:21
【问题描述】:

我写了一个使用函数的简单计算器。

#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 来解决这个问题,果然,我得到了错误的输出。

【问题讨论】:

  • 不要像那样不必要地使用全局变量。这是不好的做法,会让你感到困惑。 operation_menu 正在使用全局 num1num2getNumber 正在扫描同名的局部变量。
  • 感谢您的澄清!你一提到它我就注意到了。我已经完成了程序,它正在按预期运行。下次我会尽量不要在全局范围内鲁莽地声明变量。非常感谢!

标签: c integer output printf scanf


【解决方案1】:

函数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;
}

【讨论】:

  • 非常感谢您!我听取了大家的建议,删除了全局变量,在 main(); 中将它们声明为局部变量。此外,在查看我的代码时,我意识到它是多么的混乱,所以我将它废弃并从头开始编写。我能够完成并运行该程序,总共只有大约 2 个错误(显然,我已修复)。对于提出基本问题,我深表歉意,但我是初学者,我将继续研究指针。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2020-11-09
  • 2014-01-27
  • 2020-02-10
  • 2015-10-15
相关资源
最近更新 更多