【问题标题】:How can I get input integers from user until he press enter by using eof?如何从用户那里获取输入整数,直到他使用 eof 按下回车键?
【发布时间】:2018-11-01 12:58:24
【问题描述】:

我们开始编写 C 代码,但我无法解决我的硬件问题,因为我不知道如何从用户那里获取输入(整数),直到他按下 Enter 键(如 20 30 10 40),然后使用 eof 完成。 这是部分代码不起作用,

printf("Students, please enter heights!\n");
   while((scanf("%d",&height))!=EOF)
    {
        if(height>0)
        {
            avg_girls=avg_girls+height;
            counter_girls++;
        }

        else
        {
            avg_boys=avg_boys+height;
            counter_boys++;
        }  
    }

我进入了无限循环 非常感谢。

【问题讨论】:

  • 如果你不使用scanf,这会容易得多。 (请改用fgetsstrtol。)
  • 非常感谢,但我们在一周前开始使用 c,我认为我们应该使用 scanf
  • 你确定你需要做你想做的事吗?作业说了什么?

标签: c input int scanf eof


【解决方案1】:

虽然从一行中读取未知数量的整数的更好方法是将整行读取到足够大小的缓冲区中,然后使用 strtol 逐步遍历缓冲区(利用其 endptr 参数更新你在缓冲区中的位置到1-character 过去最后一个转换的值),你可以使用scanf 并完成同样的事情。

使用scanf 从一行输入中读取多个整数的一种方法是简单地读取每个字符并确认它不是'\n' 字符或EOF。如果字符不是数字(或数字前的 '-' 符号 - thanks Ajay Brahmakshatriya),那么就去获取下一个字符。如果字符是数字,则将其放回stdinungetc,然后调用scanf验证转换,然后根据输入的符号更新女孩或男孩的平均值。

您可以执行以下操作:

    int height;

    fputs ("enter heights: ", stdout);

    while ((height = getchar()) != '\n' && height != EOF) {
        /* if not '-' and not digit, go read next char */
        if (height != '-' && !isdigit (height))
            continue;
        ungetc (height, stdin);     /* was digit, put it back in stdin */
        if (scanf ("%d", &height) == 1) {   /* now read with scanf */
            if (height > 0) {       /* postive val, add to girls */
                avg_girls += height;
                counter_girls++;
            }
            else {                  /* negative val, add to boys */
                avg_boys += height;
                counter_boys++;
            }
        }
    }

isspace() 宏由 ctype.h 标头提供。如果您不能包含其他标题,则只需手动检查 height 是否为数字,例如

    if (height != '-' && (height < '0' || '9' < height))
        continue;

(请记住,您正在阅读带有getchar()字符,因此请与'0''9' 的ASCII 字符进行比较)

另一种选择是将整行输入读入缓冲区,然后在处理缓冲区时重复调用 sscanf 转换整数,另外使用 "%n" 说明符报告调用 @ 消耗的字符数987654343@。 (例如,使用"%d%n" 并提供指向int 的指针来保存"%n" 提供的值)然后您可以从缓冲区的开头保持偏移量 的总和以添加到指向sscanf 位置的指针以供下次读取。

无论哪种方式都可以,但是对于新的 C 程序员来说,与尝试使用 scanfstdin 本身一起工作相比,一次阅读一行所带来的陷阱要少得多。

【讨论】:

  • 非常感谢,你帮了我很多,我可以再问一个关于解决方案的问题吗?
  • 由于OP也需要输入负整数if(!isdigit (height)) --&gt; if(!isdigit(height) &amp;&amp; height != '-')
  • @Ofirlevy 当然,如果它是后续版本,请发表评论。我会在一小时左右到。
【解决方案2】:

你可以使用 scanf 和 array 来实现。

while (scanf("%d*[^\n]", &height[i++]) == 1 && i < height_len);

scanf 将返回正确读取的项目数。

然后处理你的身高。

【讨论】:

  • 这不起作用,%d 无论如何都会尝试在数字之前吃掉换行符。
  • 谢谢,应该是 "%d*[^\n]"。
  • 我试过thissn-p,它似乎工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
相关资源
最近更新 更多