简单单位转换程序 - do-while 循环的 scanf 问题(C 编程)
Simple Unit Conversion Program - scanf issues with do-while loop (C programming)
我目前遇到的问题是程序没有执行到第一个 scanf 命令之前的部分,只是跳过了整个决策过程和 returns 到 do-while 循环的开头.我已经阅读了其他告诉人们使用 fgetc() 的建议,因为输入转换类型 (1-5) 后的回车按钮会在输入缓冲区中创建一个空的 space ,这会阻止这种情况发生,但我真的宁愿不是因为它不是我当前学习的一部分 material,作为最后的手段我将使用它,甚至我不确定如何代替 scanf 实现。该程序看起来好像完成了,将其转换为 c++ 代码(我熟悉的代码)使其可以工作,但由于某种原因,它在 C 代码中没有与我合作。我还尝试了 Whosebug 的另一个建议,其中提到使用 scanf:scanf("%c*c", &conversionDirection);这实际上确实允许它进入下一节,但有时会迫使你两次输入你的决定,第一次输入没有给你反应......如果有人可以从这里开始测试这个代码原因,我将非常感激我不知道该怎么做了,我已经尝试了一切。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int userChoice;
char conversionDirection;
float calculateNumber;
do
{
printf("Please enter one of the following: \n");
printf("Number\tConversion\n\n");
printf("1\t Kilogram/Pound\n");
printf("2\t Litre/Gallon\n");
printf("3\t Centimeter/Inch\n");
printf("4\t Celsius/Fahrenheit\n");
printf("5\t Quit\n");
scanf("%d", &userChoice);
if (userChoice == 1)
{
printf("Enter 'K' for Kilogram -> Pound or Enter 'P' for Pound -> Kilogram\n");
scanf("%c", &conversionDirection);
if (conversionDirection == 'K')
{
printf("Please enter the amount of Kilograms\n");
scanf("%f", &calculateNumber);
printf("%f Kilograms is equal to %f Pounds\n\n", calculateNumber, calculateNumber * 2.2);
}
else if (conversionDirection == 'P')
{
printf("Please enter the amount of Pounds\n");
scanf("%f", &calculateNumber);
printf("%f Pounds is equal to %f Kilograms\n\n", calculateNumber, calculateNumber / 2.2);
}
}
else if (userChoice == 2)
{
printf("Enter 'L' for Litre -> Gallon or Enter 'G' for Gallon -> Litre\n");
scanf("%c", &conversionDirection);
if (conversionDirection == 'L')
{
printf("Please enter the amount of Litres\n");
scanf("%f", &calculateNumber);
printf("%f Liters is equal to %f Gallons\n\n", calculateNumber, calculateNumber * 0.264172);
}
else if (conversionDirection == 'G')
{
printf("Please enter the amount of Gallons\n");
scanf("%f", &calculateNumber);
printf("%f Gallons is equal to %f Liters\n\n", calculateNumber, calculateNumber / 0.264172);
}
}
else if (userChoice == 3)
{
printf("Enter 'C' for Centimeter -> Inch or Enter 'I' for Inch -> Centimeter");
scanf("%c", &conversionDirection);
if (conversionDirection == 'C')
{
printf("Please enter the amount of Centimeters\n");
scanf("%f", &calculateNumber);
printf("%f Centimeters is equal to %f Inches\n\n", calculateNumber, calculateNumber * 0.393701);
}
else if (conversionDirection == 'I')
{
printf("Please enter the amount of Inches\n");
scanf("%f", &calculateNumber);
printf("%f Inches is equal to %f Centimeters\n\n", calculateNumber, calculateNumber / 0.393701);
}
}
else if (userChoice == 4)
{
printf("Enter 'C' for Celsius -> Fahrenheit or Enter 'F' for Fahrenheit -> Celsius");
scanf("%c", &conversionDirection);
if (conversionDirection == 'C')
{
printf("How many degrees Celsius?\n");
scanf("%f", &calculateNumber);
printf("%f degrees Celsius is equal to %f degrees Fahrenheit\n\n", calculateNumber, (calculateNumber * 9 / 5) + 32);
}
else if (conversionDirection == 'F')
{
printf("How many degrees Fahrenheit?\n");
scanf("%f", &calculateNumber);
printf("%f degrees Fahrenheit is equal to %f degrees Celsius\n\n", calculateNumber, (calculateNumber - 32) * 5 / 9);
}
}
else if (userChoice == 5)
{
printf("Program Exit");
return 0;
}
else
{
printf("Please enter a valid number");
}
} while (userChoice != 5);
return 0;
}
使用 scanf 时的两个建议(尤其是数字):
1) 在每次调用 scanf 之前使用 fflush(stdin);
;
2) 检查 unputs 的结果 - 是否收到号码?
例如,如果输入不正确就无法工作:
do{
printf("Please, enter number: ");
fflush(stdin);
} while( 1 == scanf("%d", &number));
我目前遇到的问题是程序没有执行到第一个 scanf 命令之前的部分,只是跳过了整个决策过程和 returns 到 do-while 循环的开头.我已经阅读了其他告诉人们使用 fgetc() 的建议,因为输入转换类型 (1-5) 后的回车按钮会在输入缓冲区中创建一个空的 space ,这会阻止这种情况发生,但我真的宁愿不是因为它不是我当前学习的一部分 material,作为最后的手段我将使用它,甚至我不确定如何代替 scanf 实现。该程序看起来好像完成了,将其转换为 c++ 代码(我熟悉的代码)使其可以工作,但由于某种原因,它在 C 代码中没有与我合作。我还尝试了 Whosebug 的另一个建议,其中提到使用 scanf:scanf("%c*c", &conversionDirection);这实际上确实允许它进入下一节,但有时会迫使你两次输入你的决定,第一次输入没有给你反应......如果有人可以从这里开始测试这个代码原因,我将非常感激我不知道该怎么做了,我已经尝试了一切。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int userChoice;
char conversionDirection;
float calculateNumber;
do
{
printf("Please enter one of the following: \n");
printf("Number\tConversion\n\n");
printf("1\t Kilogram/Pound\n");
printf("2\t Litre/Gallon\n");
printf("3\t Centimeter/Inch\n");
printf("4\t Celsius/Fahrenheit\n");
printf("5\t Quit\n");
scanf("%d", &userChoice);
if (userChoice == 1)
{
printf("Enter 'K' for Kilogram -> Pound or Enter 'P' for Pound -> Kilogram\n");
scanf("%c", &conversionDirection);
if (conversionDirection == 'K')
{
printf("Please enter the amount of Kilograms\n");
scanf("%f", &calculateNumber);
printf("%f Kilograms is equal to %f Pounds\n\n", calculateNumber, calculateNumber * 2.2);
}
else if (conversionDirection == 'P')
{
printf("Please enter the amount of Pounds\n");
scanf("%f", &calculateNumber);
printf("%f Pounds is equal to %f Kilograms\n\n", calculateNumber, calculateNumber / 2.2);
}
}
else if (userChoice == 2)
{
printf("Enter 'L' for Litre -> Gallon or Enter 'G' for Gallon -> Litre\n");
scanf("%c", &conversionDirection);
if (conversionDirection == 'L')
{
printf("Please enter the amount of Litres\n");
scanf("%f", &calculateNumber);
printf("%f Liters is equal to %f Gallons\n\n", calculateNumber, calculateNumber * 0.264172);
}
else if (conversionDirection == 'G')
{
printf("Please enter the amount of Gallons\n");
scanf("%f", &calculateNumber);
printf("%f Gallons is equal to %f Liters\n\n", calculateNumber, calculateNumber / 0.264172);
}
}
else if (userChoice == 3)
{
printf("Enter 'C' for Centimeter -> Inch or Enter 'I' for Inch -> Centimeter");
scanf("%c", &conversionDirection);
if (conversionDirection == 'C')
{
printf("Please enter the amount of Centimeters\n");
scanf("%f", &calculateNumber);
printf("%f Centimeters is equal to %f Inches\n\n", calculateNumber, calculateNumber * 0.393701);
}
else if (conversionDirection == 'I')
{
printf("Please enter the amount of Inches\n");
scanf("%f", &calculateNumber);
printf("%f Inches is equal to %f Centimeters\n\n", calculateNumber, calculateNumber / 0.393701);
}
}
else if (userChoice == 4)
{
printf("Enter 'C' for Celsius -> Fahrenheit or Enter 'F' for Fahrenheit -> Celsius");
scanf("%c", &conversionDirection);
if (conversionDirection == 'C')
{
printf("How many degrees Celsius?\n");
scanf("%f", &calculateNumber);
printf("%f degrees Celsius is equal to %f degrees Fahrenheit\n\n", calculateNumber, (calculateNumber * 9 / 5) + 32);
}
else if (conversionDirection == 'F')
{
printf("How many degrees Fahrenheit?\n");
scanf("%f", &calculateNumber);
printf("%f degrees Fahrenheit is equal to %f degrees Celsius\n\n", calculateNumber, (calculateNumber - 32) * 5 / 9);
}
}
else if (userChoice == 5)
{
printf("Program Exit");
return 0;
}
else
{
printf("Please enter a valid number");
}
} while (userChoice != 5);
return 0;
}
使用 scanf 时的两个建议(尤其是数字):
1) 在每次调用 scanf 之前使用 fflush(stdin);
;
2) 检查 unputs 的结果 - 是否收到号码?
例如,如果输入不正确就无法工作:
do{
printf("Please, enter number: ");
fflush(stdin);
} while( 1 == scanf("%d", &number));