C程序确定温度转换不起作用

问题描述 投票:-2回答:3

我正在尝试创建一个程序,询问用户用户想要做什么转换,然后扫描他们想要转换的数字,然后进行转换并将其吐出。

以下是包含所需输出的说明:

建立一个程序,创建一个程序,选择将Celsius转换为华氏度或华氏度到摄氏度,使用“ifelse”语句选择要使用的转换。请确保在.C文件中包含正确的标头。使用K和R格式。将文件命名为“first last last name-assingment2.c”ex:“rgalus-assingment2.c”以下是我期望程序输出的样子:

Enter 1 to convert Celsius to Fahrenheit
Enter 2 to convert Fahrenheit to Celsius
Enter 0 to exit

1
10
10 degrees Celsius is equal to 50 degrees Fahrenheit

Enter 1 to convert Celsius to Fahrenheit
Enter 2 to convert Fahrenheit to Celsius
Enter 0 to exit

2
32
32 degrees Fahrenheit equals 0 degrees Celsius

Enter 1 to convert Celsius to Fahrenheit
Enter 2 to convert Fahrenheit to Celsius
Enter 0 to exit

0

“exit the program”

我的问题是,虽然它会扫描我的选择,但程序在我输入要转换的数字之前结束。

以下是我的代码:

#include <stdio.h>

int main(void) {
    double userConversionChoice;
    double CelsiusToFahrenheitResult;
    double FahrenheitToCelsiusResult;
    double userConversionNumber;

    printf("Enter 1 to convert Celsius to Fahrenheit\n");
    printf("Enter 2 to convert Fahrenheit to Celsius\n");
    printf("Enter 0 to exit\n");

    scanf("%d", userConversionChoice);

    if (userConversionChoice == 1) {

        scanf("%d", userConversionNumber);
        CelsiusToFahrenheitResult = (1.8 * userConversionNumber) + 32.0;

        printf("%d degrees Celsius equals %d degrees Fahrenheit", userConversionNumber, CelsiusToFahrenheitResult);

        }
        else {

        if (userConversionChoice == 2) {
            scanf("%d", userConversionNumber);
            FahrenheitToCelsiusResult = (userConversionNumber - 32.0) / 1.8;

            printf("%d degrees Fahrenheit equals %d degrees Celsius", userConversionNumber, FahrenheitToCelsiusResult);
        }
            else {
                printf("exit the program");
            }
        }




    return(0);
}
c scanf
3个回答
2
投票

当前的问题是:

  • scanf指向变量(&x),而不是变量。这是因为正常函数调用f(x)无法修改x(参数按值传递)。
  • %d转换说明符读取整数(并期望相应的int *参数)。您的变量是double类型,因此您需要将它们更改为int或使用%lf
  • 同样,printf %d期待一个int,而不是doubledouble的格式说明符是%f
  • 使用scanf时,应检查返回值,以确保成功读取值。 scanf返回分配的输入项数。

从而:

int userConversionChoice;
if (scanf("%d", &userConversionChoice) != 1) {
    fprintf(stderr, "failed to read input\n");
    return EXIT_FAILURE;  // EXIT_FAILURE is in <stdlib.h>
}
double userConversionNumber;
if (scanf("%lf", &userConversionNumber) != 1) {
printf("%.2f degrees Celsius equals %.2f degrees Fahrenheit", userConversionNumber, CelsiusToFahrenheitResult);

从长远来看,我建议完全避免使用scanf进行用户输入。它很难正确使用,它会使用户界面混乱(例如,如果用户只是点击进入,你的程序会在那里看似冻结,但实际上仍在等待scanf中的输入),并且很难从错误中恢复。

为了更直观的行为,阅读整行输入(使用例如fgets)并在之后转换它们(使用例如sscanfstrtod / strtol):

char buf[200];

...
printf("enter a number: ");
fflush(stdout);
if (!fgets(buf, sizeof buf, stdin)) {
    return 0;  // end-of-input was reached
}
double num = strtod(buf, NULL);  // convert input to number

1
投票

userConversionNumber是一个double。您正在使用%d读取它,&是整数的转换说明符。并且您在阅读时没有使用scanf("%d", userConversionChoice); (地址)运算符。

userConversionChoice

所以将int定义为scanf("%d", &userConversionChoice); 并以这种方式读取输入:

scanf

scanf的行为:

如果在第一次转换(如果有)完成之前发生输入故障,scanf函数将返回宏EOF的值。否则,该函数返回分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零。

因此,在进一步处理之前检查#include <stdio.h> int main(void) { int userConversionChoice; double CelsiusToFahrenheitResult; double FahrenheitToCelsiusResult; double userConversionNumber; printf("Enter 1 to convert Celsius to Fahrenheit\n"); printf("Enter 2 to convert Fahrenheit to Celsius\n"); printf("Enter 0 to exit\n"); printf("Choice> "); scanf("%d", &userConversionChoice); if (userConversionChoice == 1) { printf("Temperature> "); scanf("%lf", &userConversionNumber); CelsiusToFahrenheitResult = (1.8 * userConversionNumber) + 32.0; printf("%0.2lf degrees Celsius equals %0.2lf degrees Fahrenheit", userConversionNumber, CelsiusToFahrenheitResult); } else if (userConversionChoice == 2) { printf("Temperature> "); scanf("%lf", &userConversionNumber); FahrenheitToCelsiusResult = (userConversionNumber - 32.0) / 1.8; printf("%0.2lf degrees Fahrenheit equals %0.2lf degrees Celsius", userConversionNumber, FahrenheitToCelsiusResult); } else { printf("exit the program"); } return(0); } 的返回值是一个好习惯。


0
投票

您对scanf(和printf)的使用不正确。

格式字符串必须与您使用的参数类型匹配。你有时可以在printf()上使用它,但不能扫描scanf()。

对于scanf(),还必须传递要存储的变量的地址(即:指针)。

qazxswpoi

显然,这里有一些优化空间,因为有两个代码输入温度。

© www.soinside.com 2019 - 2024. All rights reserved.