C程序问题:scanf isn';t工作不正常

C程序问题:scanf isn';t工作不正常,c,arrays,function,pointers,C,Arrays,Function,Pointers,下面的程序应该演示如何使用指向函数的指针数组。除了更改num1和num2的值的scanf语句(我在代码中对它们进行了注释),其他一切都很好。如果我初始化变量并使它们相等,比如2,那么当我运行程序时,无论我在scanf中输入什么来替换值,它们的值都将是2。在此方面的任何帮助都将不胜感激 #include <stdio.h> // function prototypes void add (double, double); void subtract (double, dou

下面的程序应该演示如何使用指向函数的指针数组。除了更改num1和num2的值的scanf语句(我在代码中对它们进行了注释),其他一切都很好。如果我初始化变量并使它们相等,比如2,那么当我运行程序时,无论我在scanf中输入什么来替换值,它们的值都将是2。在此方面的任何帮助都将不胜感激

#include <stdio.h>

// function prototypes
void add      (double, double);
void subtract (double, double);
void multiply (double, double);
void divide   (double, double);

int main(void)
{
    // initialize array of 4 pointers to functions that each take two
    // double arguments and return void.
    void(*f[4])(double, double) = { add, subtract, multiply, divide };

    double num1;   // variable to hold the 1st number
    double num2;   // variable to hold the 2nd number
    size_t choice; // variable to hold the user's choice

    printf("%s", "Which operation would you like to perform on the two numbers?\n");
    printf("%s", "[0] add\n");
    printf("%s", "[1] subtract\n");
    printf("%s", "[2] multiply\n");
    printf("%s", "[3] divide\n");
    printf("%s", "[4] quit\n");
    scanf_s("%u", &choice);

    // process user's choice
    while (choice >= 0 && choice < 4)
    {
        printf("%s", "Enter a number: ");
        scanf_s("%f", &num1); // <--- THIS SCANF_S STATEMENT ISN'T CHANGING NUM1'S VALUE
        printf("%s", "Enter another number: ");
        scanf_s("%f", &num2); // <--- THIS SCANF_S STATEMENT ISN'T CHANGING NUM2'S VALUE

        // invoke function at location choice in array f and pass
        // num1 and num2 as arguments
        (*f[choice])(num1, num2);

        printf("%s", "Which operation would you like to perform on the two numbers?\n");
        printf("%s", "[0] add\n");
        printf("%s", "[1] subtract\n");
        printf("%s", "[2] multiply\n");
        printf("%s", "[3] divide\n");
        printf("%s", "[4] quit\n");
        scanf_s("%u", &choice);
    } // end while loop

    puts("Program execution completed");
} // end main

void add(double a, double b)
{
    printf("%1.2f + %1.2f = %1.2f\n", a, b, a + b);
}

void subtract(double a, double b)
{
    printf("%1.2f - %1.2f = %1.2f\n", a, b, a - b);
}

void multiply(double a, double b)
{
    printf("%1.2f * %1.2f = %1.2f\n", a, b, a * b);
}

void divide(double a, double b)
{
    printf("%1.2f / %1.2f = %1.2f\n", a, b, a / b);
}
#包括
//功能原型
无效添加(双,双);
空减法(双倍,双倍);
空乘(双倍,双倍);
无效分割(双倍,双倍);
内部主(空)
{
//初始化4个指针的数组,每个指针指向两个
//双重参数并返回void。
void(*f[4])(double,double)={加、减、乘、除};
double num1;//用于保存第一个数字的变量
double num2;//用于保存第二个数字的变量
size\u t choice;//保存用户选择的变量
printf(“%s”,“您希望对这两个数字执行哪个操作?\n”);
printf(“%s”,“[0]添加\n”);
printf(“%s”,“[1]减法\n”);
printf(“%s”,“[2]乘法\n”);
printf(“%s”,“[3]除法\n”);
printf(“%s”,“[4]退出\n”);
scanf_s(“%u”和选项);
//处理用户的选择
while(选项>=0&&choice<4)
{
printf(“%s”,“输入一个数字:”);

scanf_s(“%f”、&num1);//正如其他人所说,使用正确的格式说明符

1) 当使用
scanf()
时,
%f“
代表
浮点
%lf”
代表
双精度

double num1;
// scanf_s("%f", &num1);
scanf_s("%lf", &num1);
2) 使用
“%u”
可以在特定平台上工作,但是
大小和
无符号大小不一定相同。对于C11,(可能还有C99),使用
z
修饰符

size_t choice;
// scanf_s("%u", &choice);
scanf_s("%zu", &choice);
3) 从
scanf\u s()
检查结果总是好的


尝试
%lf
而不是
%f
scanf
工作正常。您没有正确地实现它。在程序中正确地使用了空格。当我将它复制到堆栈溢出时,我不得不用一堆东西使它显示在灰显的代码部分,结果它将空格弄错了。只是一点:“printf”(“%s”,“[0]add\n”);”-为什么要这样做?@Rob:实际上,正确的方法是
printf(“%s\n”,“[0]add”);
。按
printf([0]add\n”)进行操作;
通常不是一个好主意。
printf
的format参数专门用于格式说明符。一旦开始将通用字符串塞进该参数,您就有可能创建一个意外的“格式说明符”(例如,意外使用
%
).因此,通常建议将通用字符串放入
printf
的进一步参数中,并仅在格式中使用
%s
if (1 != scanf_s(...)) {
  ; // handle_error();
}