【问题标题】:For loop skipping scanf()For 循环跳过 scanf()
【发布时间】:2016-07-14 21:13:42
【问题描述】:

我正在尝试编写一个小程序,其中用户指定他们希望输入 n 多个数字,然后提示他们在后续行中输入 n 多个浮点数并带有提示。 预期的输出是

$./a.out
How many number (at least two)? > 4
Enter a number (3 more to enter) > 2
Enter a number (2 more to enter) > 3
Enter a number (1 more to enter) > 5
Enter a number (0 more to enter) > 7

但是,我的程序当前读取第一个输入(在我的示例中为 2),然后跳过其余提示的用户输入。

我当前代码的输出是

$./a.out
How many number (at least two)? > 4
Enter a number (3 more to enter) > 7
Enter a number (2 more to enter) > 
Enter a number (1 more to enter) > 
Enter a number (0 more to enter) >

我搜索了hereherehere 的解决方案,但我什么也做不了。 有没有人对如何让 scanf 在这方面工作有任何建议? 我更喜欢使用 scanf,因为我们没有介绍任何 get 函数的用法。


#include <stdlib.h>
#include <stdio.h>

main(){
    int i,n;
    int temp_count,count,rv;
    float number[10000];
    printf("How many number (at least two)? > ");
    rv = scanf("%d",&n);
    if(n<2||rv!=1){
        printf("Please enter at least two numbers");
    }
    count=n;
    for(i=0;i<n;i++){
        count--;
        printf("Enter a number (%d more to enter) > ",count);
        fflush(stdin);
        scanf(" %.2f",number[i]);
    }
    return(0);
}    //end main

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    作为用户@user3121023 cmets(评论现已删除):

    scanf("%f",&number[i]); ampersand needed. Do not fflush(stdin);
    

    scanf() 的最后一个参数应该是指向将存储输入的缓冲区的指针。在您的情况下,number[i]float,而不是 float *。在number[i] 之前添加&amp; 将为scanf() 提供数组的i:th 位置的地址。

    此外,在输入流上使用fflush() 是一个坏主意,因为它会调用未定义的行为。它可能有效,但可能无效。请参阅here 以获取fflush() 上的参考。

    注意:输入流上的fflush()由 POSIX(非标准 C)很好地定义,并且仅在流可搜索时。标准输入通常不可搜索。

    【讨论】:

    • 啊,缺少 & 是一个愚蠢的错误,我没有发现。但是,即使删除了 fflush(...),我也没有得到正确的输出。
    • @Zermelo's_Choice 还修复了格式说明符。扫描%f。您可以将%.2fprintf() 一起使用,但不能与scanf() 一起使用。
    • @Zermelo's_Choice “我没有得到正确的输出”,但也接受了答案。您能否澄清是什么解决了您的问题,以便读者知道?
    • @underscore_d 是的,我会在我原来的问题中添加一个注释。
    • @Zermelo's_Choice 谢谢,但假设它来自这个答案,我的建议是写在这里,因为你的问题应该是......好吧,一个问题,而不是一个答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多