2

这是代码

       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 中获得了它的价值

4

4 回答 4

3

转换在整数停止的%d地方停止,这是一个小数点。如果你想丢弃那里的输入,明确地这样做......getc在循环中fgets,等等。这也允许您验证输入。该程序可能应该抱怨4.4.

于 2013-01-26T00:18:48.327 回答
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;
}
于 2013-01-26T00:32:14.840 回答
0

该功能按照规范scanf以这种方式工作:

输入项应定义为输入字节的最长序列(直到任何指定的最大字段宽度,可以根据转换说明符以字符或字节为单位测量),它是匹配序列的初始子序列。[强调补充。]

在您的示例中,以下 C 字符串表示第一次调用请求输入时stdin的内容: 。scanf"4.4\n"

对于此初始调用,您的格式字符串包含一个说明符%d,它表示一个整数。这意味着该函数将从标准输入中读取尽可能多的满足整数定义的字节。在您的示例中,这只是4,让stdin包含".4\n"(如果这让您感到困惑,您可能需要检查什么是整数)。

第二次调用scanf不要求用户提供任何额外的输入,因为标准输入已经包含".4\n"如上所示。使用格式字符串尝试从stdin%f的当前值读取浮点数。它读取的数字是(根据规范,在大多数情况下忽略空格)。.4scanf\n

要完全回答您的问题,问题不在于您在滥用scanf,而在于您输入的内容与您期望scanf的行为方式之间存在不匹配。

如果你想保证人们不会像那样搞乱输入,我建议使用strtolandstrtodfgets代替。

于 2013-01-26T00:57:06.000 回答
-2

在 first 之后使用一个 fflush(stdin)函数scanf(),这将刷新输入缓冲区。

于 2013-05-02T15:15:54.007 回答