我正在尝试创建一个程序,询问用户用户想要做什么转换,然后扫描他们想要转换的数字,然后进行转换并将其吐出。
以下是包含所需输出的说明:
建立一个程序,创建一个程序,选择将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);
}
当前的问题是:
scanf
指向变量(&x
),而不是变量。这是因为正常函数调用f(x)
无法修改x
(参数按值传递)。%d
转换说明符读取整数(并期望相应的int *
参数)。您的变量是double
类型,因此您需要将它们更改为int
或使用%lf
。printf
%d
期待一个int
,而不是double
。 double
的格式说明符是%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
)并在之后转换它们(使用例如sscanf
或strtod
/ 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
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);
}
的返回值是一个好习惯。
您对scanf(和printf)的使用不正确。
格式字符串必须与您使用的参数类型匹配。你有时可以在printf()上使用它,但不能扫描scanf()。
对于scanf(),还必须传递要存储的变量的地址(即:指针)。
qazxswpoi
显然,这里有一些优化空间,因为有两个代码输入温度。