C - 读取和2d int数组,行以0结尾,直到输入结束

时间:2017-01-12 11:14:21

标签: c arrays

我正在尝试在C中编写一个程序,它将读取最多50行的5个整数,并在到达stdin结束后打印它们。

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

int readInput(int numbers[][5], int row) {
    int x, i = 0;
    while (1) {
        if (scanf("%d", &x) !=1 ) exit (1);
        if (x == 0) {
            return 1;
        }
        if (feof(stdin)) {
            return 0;
        }
        numbers[row][i] = x;
        i++;
    }
}

int main ( void ) {
    int numbers[50][5];
    int row = 0; int val;
    int i,j;
    while (1) {

        val = readInput(numbers, row);
        if ( val == 1){
            row++;
            continue;
        } else if (val == 0) {
            break;
        }
    }

    for (i = 0; i < row+1; i++) {
        for ( j = 0; j < 5; j++) {
            printf("%d ", numbers[i][j]);
        }printf("\n");
    }

}

问题在于,无论我如何尝试告诉程序主要的无限循环需要结束,它永远不会。我真的需要理解达到输入结束的概念,这就是为什么我不想简单地写一个循环,经过一定量的迭代后完成,我想学习如何在到达stdin结束后打破循环。

1 个答案:

答案 0 :(得分:2)

您当前的代码无法捕获scanf可能返回的EOF。

您可以尝试以下内容:

int readInput(int numbers[][5], int row) {
    int x, i = 0;
    while (1) {
      int t = scanf("%d", &x);  // Save return value
      if (t == EOF) return 0;   // Check for EOF
      if (t !=1 ) exit (1);

      if (x == 0) {
          return 1;
      }

      numbers[row][i] = x;
      i++;
    }
}

CTRL + D (或 CTRL + Z for windows)可用于指示EOF