这是代码
printf("\n");
printf("Enter a integer vaule:");
scanf("%d" , &num3);
printf("You entered: %015d", num3);
printf("Enter a float value:");
scanf("%f", &deci3);
printf("You entered: %15.2f", deci3);
printf("\n");
输出
Enter a integer vaule:4.4
You entered: 000000000000004
Enter a float value:You entered: 0.40
问题是这段代码没有停在
printf("Enter a float value:");
和此scanf
scanf("%f", &deci3);
似乎从之前的scanf
获得了它的价值答案 0 :(得分:3)
%d
转换在整数停止的任何地方停止,这是一个小数点。如果要放弃那里的输入,请在循环,getc
等中明确地{... 1}}执行此操作。这也允许您验证输入。该计划应该抱怨fgets
。
答案 1 :(得分:0)
这样可行,但如果你为int
键入4.4,它就不会抱怨#include <stdio.h>
int main() {
char buffer[256];
int i;
float f;
printf("enter an integer : ");
fgets(buffer,256,stdin);
sscanf(buffer, "%d", &i);
printf("you entered : %d\n", i);
printf("enter a float : ");
fgets(buffer,256,stdin);
sscanf(buffer, "%f", &f);
printf("you entered : %f\n", f) ;
return 0;
}
答案 2 :(得分:0)
scanf
函数按照specification:
输入项应定义为输入字节的最长序列(直到任何指定的最大字段宽度,可以用字符或字节来衡量,取决于转换说明符)匹配的初始子序列序列。 [强调补充。]
在您的示例中,当第一个scanf
呼叫请求输入时,以下C字符串表示 stdin 的内容:"4.4\n"
。
对于此初始调用,您的格式字符串由单个说明符%d
组成,表示整数。这意味着该函数将从 stdin 中读取尽可能多的字节,这些字节满足整数的定义。在您的示例中,这只是4
,让 stdin 包含".4\n"
(如果这让您感到困惑,您可能需要查看what an integer is)。< / p>
对scanf
的第二次调用不会请求用户提供任何其他输入,因为 stdin 已包含".4\n"
,如上所示。使用格式字符串%f
尝试从 stdin 的当前值读取浮点数。它读取的数字是.4
(根据规范,scanf
在大多数情况下忽略像\n
这样的空格。
要完全回答您的问题,问题不在于您滥用scanf
,而在于您输入的内容与您期望scanf
的行为方式之间存在不匹配。
如果您想保证人们不会搞砸这样的输入,我建议您将strtol
和strtod
与fgets
结合使用。
答案 3 :(得分:-2)
在第fflush(stdin)
后使用scanf()
函数,这将刷新输入缓冲区。