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
用于双打)。
我想弄清楚为什么我无法将其正确地 运行。我只需要来自用户的四个输入,运行 最后的计算。
#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
用于双打)。