【问题标题】:having trouble with a "\n" and scanf遇到“\n”和scanf问题
【发布时间】:2013-01-26 00:12:14
【问题描述】:

这里是代码

       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 中得到它的值

【问题讨论】:

  • 如果你想要一个像样的行输入功能,请看这里:stackoverflow.com/questions/4023895/… - 它是基于行的输入的理想选择,然后你可以sscanf 并根据需要检查格式问题。

标签: c newline printf scanf


【解决方案1】:

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

【讨论】:

  • 我认为scanf 总是清理退货。他得到了这个输出,因为他在 scanf 之前使用了 getc。
【解决方案2】:

scanf 函数根据specification 以这种方式工作:

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

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

对于这个初始调用,您的格式字符串由一个说明符%d 组成,它表示一个整数。这意味着该函数将从 stdin 中读取满足整数定义的尽可能多的字节。在您的示例中,这只是 4,留下 stdin 以包含 ".4\n"(如果这让您感到困惑,您可能需要查看 what an integer is)。

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

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

如果你想保证人们不会像那样搞乱输入,我建议将strtolstrtodfgets 结合使用。

【讨论】:

    【解决方案3】:

    这可行,但如果您为 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;
    }
    

    【讨论】:

    • 得到“警告:这个程序使用gets(),这是不安全的。”
    • gets 只是乞求缓冲区溢出。您应该使用fgets,它允许您限制读取的数量。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多