遇到“\ n”和scanf有问题

时间:2013-01-26 00:12:14

标签: c newline printf scanf

这是代码

       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 个答案:

答案 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的行为方式之间存在不匹配。

如果您想保证人们不会搞砸这样的输入,我建议您将strtolstrtodfgets结合使用。

答案 3 :(得分:-2)

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