C - Scanf 和 Printf 执行乱序,我不确定为什么

标签 c function pointers printf scanf

我有一个问题,我需要在 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/

相关文章:

C++ 使用运算符重载构建双面树 - 什么是好的内存解决方案?

c++ - 将整数转换为 C++ 中的字符指针,然后将其附加到另一个字符指针

c - 使用指针和 realloc 添加新记录

c - 如何正确初始化一个字符串,该字符串是 ANSI-C 中 RPC 自动生成结构的字段

javascript - 对于提供的参数,Wasm 编译超出了此上下文中的内部限制

c - 如何在函数内部进行 malloc 并在 C 中返回指针?

c++ - 在工厂中使用指针函数会产生编译时错误

c - 将指针传递给 C 中的递归函数

c - 如何通过单击按钮退出 gtk 应用程序?

C : Pass Array of string as function argument