vC:扫描数字输入直到EOF

时间:2014-11-10 12:26:06

标签: c

我有一个赋值,当用C编程语言时,我必须从键盘扫描多个数字(只是整数,如果它不是整数,它应该退出)。值除以空格,输入以EOF结束。我需要进一步处理这些扫描值。我知道最多的推杆数字,我事先不知道我会得到多少数字。

我试过了:

 while (scanf("%d", &a) == 1 && count <= 10000 )  {
  eof=a;
  if ( eof=getchar() == EOF ) break;
 ...

但它似乎并不像我需要的那样工作(通常你必须给EOF两次,但并不总是如此,有时它会为输入增加0)。当我使用时,也会发生同样的事情:

while (scanf("%d", &a) == 1) {

如果我尝试:

 while (... && (a=getchar()) != EOF) {

变量a被重写,我无法进一步使用它。

提前致谢。

编辑:此外,我需要区分EOF和无效输入(数字以外的东西),我不知道该怎么办,因为

scanf(...)==1

不会那样做。

2 个答案:

答案 0 :(得分:0)

请注意scanf() 01EOF的结果。

int count = 0;
int a;
int scnt;
while ((scnt = scanf("%d", &a) != EOF && count < 10000 )  {  // not <= 10000
  if (scnt == 0) {
    // Handle stdin with unconvertible input. OP wants "it should exit"
    puts("Bad");
    exit (-1);
  } else {
    // Success! Let's print it
    printf("%d %d\n", count++, a);
  }
}
// why did we quit?
if (count >= 10000)
  puts("Too many");
else if (feof(stdin)) {
  puts("EOF detected");
else if (ferror(stdin)) {  // rare
  puts("IO error on detected");
else // Should never occur
  puts("???");

答案 1 :(得分:-1)

不是扫描整数,而是使用例如一次读取整行。 fgets,然后从中获取数字。

然后,您可以轻松地将fgets来电置于循环状态,并且不需要任何其他检查。


如果使用fgets是不切实际的,那么嵌套循环怎么样,一个外部以文件结束条件(你设置的特殊标志)结束,内部使用例如getchar阅读所有字符。如果getchar返回EOF,则设置外循环的标志并突破内循环。

当然,这意味着你自己解析并整理数字,但除非你必须处理可以由普通标准类型处理的更大数字,否则它是微不足道的。