我如何才能从用户那里获得输入整数,直到他使用eof按下回车键?

时间:2018-11-01 12:58:24

标签: c input int scanf eof

我们开始编码C,但我无法解决我的问题,因为我不知道如何从用户(集成商)那里获得输入,直到他像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++;
        }  
    }

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

2 个答案:

答案 0 :(得分:1)

从行中读取未知数量的整数的更好方法是将整行读入足够大小的缓冲区,然后使用strtol(使用其{{1} }参数以将您在缓冲区中的位置更新为endptr之后的最后一个转换值),您可以使用1-character并完成相同的操作。

使用scanf从一行输入中读取多个整数的一种方法是简单地读取每个字符并确认它不是scanf字符或'\n'。如果字符不是数字(或数字前面的EOF符号-thanks Ajay Brahmakshatriya),则只需获取下一个字符即可。如果字符是数字,则用'-'将其放回stdin中,然后调用ungetc验证转换,然后根据输入的符号。

您可以执行以下操作:

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'的ASCII字符进行比较)

另一种替代方法是将整个输入行读入缓冲区,然后在通过缓冲区工作时反复调用'9'转换整数,另外利用sscanf说明符来报告由消耗的字符数呼叫"%n"。 (例如,使用sscanf并提供指向"%d%n"的指针来保存int提供的值)然后,您可以从头开始保持 offset 的运行总计将缓冲区添加到指针"%n"的位置以进行下一次读取。

这两种方法都不错,但是一次读一行就比尝试使用sscanfscanf本身给新C程序员带来了更少的陷阱。

答案 1 :(得分:-1)

您可以使用scanf和array实现此目的。

<?php 
  $values= ["one", "two"];
  function addQuotes($each_value){
     return "'".$each_value."'";
  }
?>

<script>
var Js_array = [<?php echo implode(",",array_map("addQuotes",$values)); ?>];
alert(Js_array);
</script>

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

然后处理您的身高。