C - scanf 被跳过(即使使用“%d”)

C - scanf gets skipped over (even with " %d")

我想弄清楚为什么我无法将其正确地 运行。我只需要来自用户的四个输入,运行 最后的计算。

#include <stdio.h>
#include <math.h>

int main(){
    double amount; /* amount on deposit */
    double principal; /* what's the principal */
    double rate; /* annual interest rate */
    int year; /* year placeholder and no. of total years */
    int yearNo;

    printf("What is the principal? ");
    scanf("%d", &principal);
    printf("What is the rate (in decimal)? ");
    scanf(" .2%d", &rate);
    printf("What is the principal? ");
    scanf(" %d", &principal);
    printf("How many years? ");
    scanf(" %d\n", yearNo);


    printf("%4s%21s\n", "Year", "Amount on deposit");

    /* calculate the amount on deposit for each of ten years */
    for (year = 1; year <= yearNo; year++){
        amount = principal * pow(1.0 + rate, year);
        printf("%4d%21.2f\n", year, amount);
    }
    return 0;
}

它正确地询问了本金和利率,但随后跳过了有关本金的问题并询问了年数。然后它只是坐在那里等待 "ghost" 条目?

我一直在读到 scanf() 在点击 enter 时添加了一些白色 space 但我认为 %d 之前的 space 会解决这个问题?

我还看到你可以在每个 scanf 之后添加 do { c=getchar(); } while ( c != '\n'); 但这似乎会使程序崩溃(我也在开头添加了 int c = 0;)。

感谢您的帮助或想法!

编辑:

当我更改错误的格式说明符时:

scanf(" .2%d", &rate);

至:

scanf(" %d", &rate);

然后我在输入我的值后崩溃了。

.2%d 不是 有效的格式字符串。

首先,% 必须排在第一位。此外,如果您使用浮点值,d 不是正确的字符 - 它用于 整数 值。

你应该使用类似 %f 的东西(你不需要宽度或精度修饰符)。

最重要的是,您犯了一个小错误,没有为您的 scanf 调用之一使用 指针

scanf(" %d\n", yearNo);

这可能会导致崩溃,应更改为:

scanf(" %d\n", &yearNo);

并且,作为最后的建议,完全没有必要在 %d%f 系列格式说明符之前(或之后使用换行符)使用空格。扫描仪会自动跳过这两个之前的空格。

因此,您在此程序中需要的唯一两个scanf格式字符串是"%d""%lf"f用于花车,lf 用于双打)。