2017-01-12 2 views
2

Ich versuche ein Programm in C zu schreiben, das maximal 50 Zeilen mit 5 ganzen Zahlen lesen und nach dem Erreichen von stdin ausgeben kann.C - Reading und 2d int Array mit Zeilen mit 0 bis zum Ende der Eingabe

#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"); 
    } 

} 

Problem ist, dass, egal wie ich versuche, das Programm zu sagen, dass die Endlos-Schleife in Haupt Bedürfnisse zu Ende, es nie. Ich muss wirklich das Konzept verstehen, das Ende der Eingabe zu erreichen, deshalb möchte ich nicht einfach eine Schleife schreiben, die nach einer bestimmten Anzahl von Wiederholungen endet, ich möchte lernen, wie man die Schleife bricht, nachdem das Ende der Standard erreicht wurde.

+1

zu zeigen Haben Sie versucht, die Eingabe von EOF Charakter? STRG + D (oder STRG + Z auf Windows) – StoryTeller

+0

Was denkst du ist 'eof' von' stdin'? Unter Linux sollten Sie 'CTRL + D' verwenden, um es auszulösen. – LPs

+0

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

Antwort

2

Ihr aktueller Code erfasst nicht den EOF, den scanf zurückgeben kann.

können Sie versuchen, so etwas wie:

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 (oder CTRL + Z für Fenster) können verwendet werden, um EOF

+0

Ja, ich weiß, ich kann senden und EOF-Signal mit Strg + d, meine Frage war, wie kann ich die Schleife im Wesentlichen brechen. Das Speichern des Rückgabewerts von scanf hat Folgendes bewirkt: Immer wenn ich ctrl + d versuche, wird exit (1) aufgerufen und das Programm endet. Wenn ich die Zeile mit exit (1) entferne, endet die Schleife im main nie und fragt immer nach einer weiteren Zeile, als ob t == EOF nie passiert wäre. –

Verwandte Themen