我正在尝试在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结束后打破循环。
答案 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