循环两次输出我的C程序的菜单
Loop outputs the menu of my C program twice
所以在 Code Review 上,我制作了一个计算器,可以执行加法等正常操作 (Here was the question)。无论如何,我听从了一些建议并更新了程序。然而,原始程序的菜单工作正常,它在用户运行程序时输出一次菜单,当他们完成计算时,程序将循环回到开始并再次退出菜单。就像任何其他无限循环一样。但我决定再次从头开始制作程序,但这次程序在用户进行第一次计算后输出菜单两次。我试过做 for(;;)
而不是 do-while 循环,但我遇到了同样的问题。我不知道出了什么问题,如果有人能为我解决这个问题,我将不胜感激,这样我就不会再遇到这个问题了。
代码如下:
#include <stdio.h>
#include <stdlib.h>
void getNumbers(float *, float *);
float addition(float, float);
float subtraction(float, float);
float multiplication(float, float);
float division(float, float);
int main(void)
{
do
{
float num1, num2;
char choice;
puts("\nEnter number or letter from below\n\n"
"\t1. Addition\n"
"\t2. Subtraction\n"
"\t3. Multiplication\n"
"\t4. Division\n"
"\tQ. Quit program");
printf("\nEnter choice: ");
scanf("%c", &choice);
if(choice == 'q' || choice == 'Q')
{
puts("\nQuitting program...");
exit(0);
}
else if(choice < '1' || choice > '4')
{
puts("\nInvalid input");
}
else
{
getNumbers(&num1, &num2);
if(choice == '1')
{
printf("\n%.2f + %.2f = %.2f\n", num1, num2, addition(num1, num2));
}
else if(choice == '2')
{
printf("\n%.2f - %.2f = %.2f\n", num1, num2, subtraction(num1, num2));
}
else if(choice == '3')
{
printf("\n%.2f * %.2f = %.2f\n", num1, num2, multiplication(num1, num2));
}
else if(choice == '4')
{
if(num2 == 0)
{
puts("\nDivision by zero");
}
else if(num2 != 0)
{
printf("\n%.2f / %.2f = %.2f\n", num1, num2, division(num1, num2));
}
}
else
{
puts("\nInvalid input");
}
}
}while(1);
return 0;
}
void getNumbers(float *num1_ptr, float *num2_ptr)
{
printf("\nEnter first number: ");
scanf("%f", num1_ptr);
printf("\nEnter second number: ");
scanf("%f", num2_ptr);
}
float addition(float num1, float num2)
{
return num1 + num2;
}
float subtraction(float num1, float num2)
{
return num1 - num2;
}
float multiplication(float num1, float num2)
{
return num1 * num2;
}
float division(float num1, float num2)
{
return num1 / num2;
}
可能是你的scanf
有问题?
试试这个:
scanf(" %c", &choice);
您的方式 scanf
可能会留下换行符,这将在下一次迭代中使用。
程序两次输出菜单的原因
(包括 "invalid input" 消息)
是因为值是通过 return 键输入的
(选择不多)
代码在循环回到循环顶部之前没有清空标准输入。
建议在循环结束之前添加:
while( getchar() != '\n' );
所以在 Code Review 上,我制作了一个计算器,可以执行加法等正常操作 (Here was the question)。无论如何,我听从了一些建议并更新了程序。然而,原始程序的菜单工作正常,它在用户运行程序时输出一次菜单,当他们完成计算时,程序将循环回到开始并再次退出菜单。就像任何其他无限循环一样。但我决定再次从头开始制作程序,但这次程序在用户进行第一次计算后输出菜单两次。我试过做 for(;;)
而不是 do-while 循环,但我遇到了同样的问题。我不知道出了什么问题,如果有人能为我解决这个问题,我将不胜感激,这样我就不会再遇到这个问题了。
代码如下:
#include <stdio.h>
#include <stdlib.h>
void getNumbers(float *, float *);
float addition(float, float);
float subtraction(float, float);
float multiplication(float, float);
float division(float, float);
int main(void)
{
do
{
float num1, num2;
char choice;
puts("\nEnter number or letter from below\n\n"
"\t1. Addition\n"
"\t2. Subtraction\n"
"\t3. Multiplication\n"
"\t4. Division\n"
"\tQ. Quit program");
printf("\nEnter choice: ");
scanf("%c", &choice);
if(choice == 'q' || choice == 'Q')
{
puts("\nQuitting program...");
exit(0);
}
else if(choice < '1' || choice > '4')
{
puts("\nInvalid input");
}
else
{
getNumbers(&num1, &num2);
if(choice == '1')
{
printf("\n%.2f + %.2f = %.2f\n", num1, num2, addition(num1, num2));
}
else if(choice == '2')
{
printf("\n%.2f - %.2f = %.2f\n", num1, num2, subtraction(num1, num2));
}
else if(choice == '3')
{
printf("\n%.2f * %.2f = %.2f\n", num1, num2, multiplication(num1, num2));
}
else if(choice == '4')
{
if(num2 == 0)
{
puts("\nDivision by zero");
}
else if(num2 != 0)
{
printf("\n%.2f / %.2f = %.2f\n", num1, num2, division(num1, num2));
}
}
else
{
puts("\nInvalid input");
}
}
}while(1);
return 0;
}
void getNumbers(float *num1_ptr, float *num2_ptr)
{
printf("\nEnter first number: ");
scanf("%f", num1_ptr);
printf("\nEnter second number: ");
scanf("%f", num2_ptr);
}
float addition(float num1, float num2)
{
return num1 + num2;
}
float subtraction(float num1, float num2)
{
return num1 - num2;
}
float multiplication(float num1, float num2)
{
return num1 * num2;
}
float division(float num1, float num2)
{
return num1 / num2;
}
可能是你的scanf
有问题?
试试这个:
scanf(" %c", &choice);
您的方式 scanf
可能会留下换行符,这将在下一次迭代中使用。
程序两次输出菜单的原因
(包括 "invalid input" 消息)
是因为值是通过 return 键输入的
(选择不多)
代码在循环回到循环顶部之前没有清空标准输入。
建议在循环结束之前添加:
while( getchar() != '\n' );