我有一个问题,我需要在 C 中使用函数指针编写一个菜单驱动程序。用户选择 1-3,如果 response = 1 则执行加法,如果 response = 2 则执行减法,如果 response = 则执行乘法3.
第一次运行是完美的,但是一旦我循环并尝试进行第二次计算,它会搜索选择和第一个数字,然后显示您所做的选择。
每个函数中的数学都有效,传递变量有效,只是 printf 和 scanf 语句在第一次运行后顺序不正确。
(有减法和乘法函数,它们完全相同,只是用“-”和“*”运算符代替了“+”运算符。)
我搜索了一个与此类似的问题并尝试了 fflush 和 setvbuf 命令,这些都不起作用。
void addition(int num1, int num2);
void subtraction(int num1, int num2);
void multiplication(int num1, int num2);
int main(void) {
void(*m[3])(int, int) = { addition, subtraction, multiplication };
size_t choice;
int num1, num2;
printf_s("Would like to add, subtract, or multiply?\nType 1 for
addition, 2 for subtraction, 3 for multiplication.\n");
scanf_s("%d", &choice);
printf_s("what two numbers would you like to work with?\n");
scanf_s("%d", &num1);
scanf_s("%d", &num2);
if (choice >= 1 && choice <= 3) {
(*m[choice - 1])(num1, num2);
while (choice >= 1 && choice <= 3) {
printf_s("Would like to add, subtract, or multiply?\nType 1
for addition, 2 for subtraction, 3 for multiplication.\n");
choice = 0;
scanf_s("%d\n", &choice);
printf_s("what two numbers would you like to work with?\n");
scanf_s("%d", &num1);
scanf_s("%d", &num2);
(*m[choice - 1])(num1, num2);
}
printf("execution complete");
}
return 0;
}
void addition(int num1, int num2) {
int i = 0;
i = num1 + num2;
printf("%d + %d = %d\n", num1, num2, i);
}
如果我输入以下内容:1 2 3、2 3 1,我希望输出为
"1"
"What two numbers would you like to work with?"
"2"
"3"
"2+3=5"
"would you like to add, subtract, or multiply?"
"Type 1 (...) for multiplication"
"2"
"what two numbers (...)"
"3"
"1"
"3-1 =2"
但是我得到了这个:
"1"
"What two numbers would you like to work with?"
"2"
"3"
"2+3=5"
"would you like to add, subtract, or multiply?"
"Type 1 (...) for multiplication"
"2"
"3"
"what two numbers (...)"
"1"
"3-1 =2"
如您所见,数学是正确的,但第二次它需要 2 个数字,然后它才要求 2 个数字。我看不出这是怎么可能的,因为在执行以下 printf 语句之前只扫描了一个变量。尽管我乘以的“3”保存在 num1 中,但它在 printf 之前扫描,即使语句在 printf 之后,所以这不应该是可能的。我很困惑!
最佳答案
为什么这么长这么复杂的代码?
只是替换
printf_s("Would like to add, subtract, or multiply?\nType 1 for addition, 2 for subtraction, 3 for multiplication.\n");
scanf_s("%d", &choice);
printf_s("what two numbers would you like to work with?\n");
scanf_s("%d", &num1);
scanf_s("%d", &num2);
if (choice >= 1 && choice <= 3) {
(*m[choice - 1])(num1, num2);
while (choice >= 1 && choice <= 3) {
printf_s("Would like to add, subtract, or multiply?\nType 1 for addition, 2 for subtraction, 3 for multiplication.\n");
choice = 0;
scanf_s("%d\n", &choice);
printf_s("what two numbers would you like to work with?\n");
scanf_s("%d", &num1);
scanf_s("%d", &num2);
(*m[choice - 1])(num1, num2);
}
printf("execution complete");
}
通过
for (;;) {
printf("Would like to add, subtract, or multiply?\nType 1 for addition, 2 for subtraction, 3 for multiplication.\n");
if (scanf("%d", &choice) != 1) {
puts("abort");
break;
}
if ((choice < 1) || (choice > 3))
break;
printf("what two numbers would you like to work with?\n");
if (scanf("%d %d", &num1, &num2) != 2) {
puts("abort");
break;
}
(*m[choice - 1])(num1, num2);
}
printf("execution complete");
关于C - Scanf 和 Printf 执行乱序,我不确定为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54313074/