2017-01-12 63 views
2

我想寫一個C程序,它將讀取5個整數的50行的最大值,並在到達stdin結束後打印它們。C - 閱讀和2d int數組終止0直到輸入結束

#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

你嘗試輸入EOF字符? CTRL + D(或在Windows上CTRL + Z) – StoryTeller

+0

你認爲'stdin'的'eof'是什麼?在linux上,你應該使用CTRL + D來觸發它。 – LPs

+0

http://unix.stackexchange.com/questions/16333/how-to-signal-the-end-of-stdin-input – Amarildo

回答

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 + ž適用於Windows)可用於指示EOF

+0

是的,我知道我可以用ctrl + d發送和EOF信號,我的問題是如何打破主循環。保存scanf的返回值是這樣做的:每當我嘗試ctrl + d時,exit(1)被調用並且程序結束。如果我用exit(1)刪除這行,那麼主循環永遠不會結束,並且總是要求多一行,就好像t == EOF從未發生過一樣。 –