2016-10-03 9 views
0

Ich fülle ein 10 x 10 Raster von Zeichen aus einer Eingabedatei. I überprüfen müssen, wenn das Gitter ein Quadrat ist (das heißt, hat N Zeichen N x, wobei N < = 10)c - Prüfen auf Null in einem 2d Array

Die Eingabedatei derart ist:

pitk 
olpe 
pkey 
tope 

Wenn ich das Gitter in GDB drucken , erhalte ich folgendes Ergebnis:

$1 = {"pitk\000\000\000\000\366h", 
     "olpe\000\000\001\000\000", 
     "pkey\000\000\000\000\000", 
     "tope\000\000\000\000\000", 
     "\000\344\241\367\377\177\000\000", <incomplete sequence \336>, 
     "\000\377\377\177\000\000\037\355\336", <incomplete sequence \367>, 
     "\000\177\000\000\000\000\000\000\000", 
     "\000\000\000\000\000\000\000\000\000", 
     "\000\000\000\000\000\000\000\000\r\020", 
     "\000\000\000\000\000\000\000\000\000"} 

der Teil meiner Hauptfunktion, die das Netz überprüft, ob gültig ist, ist:

bool check = (checknxn(grid)); 
    if(check == false) { 
    fprintf(stderr, "Invalid Input!\n"); 
    exit(0); 
    } 

Die checknxn Funktion:

bool checknxn(char grid[10][10]) { 
    int columns = 0; 
    for(int i=0;i<10;i++) { 
    if(grid[0][i]!=NULL) 
     columns++; 
    else { 
     break; 
    } 
    } 

    for(int i=1;i<10;i++) { 
    for(int j=columns;j<10;j++) { 
    if(grid[i][j]!=NULL) 
     return false; 
    } 
    } 

    int rows = 0; 
    for(int i=0;i<10;i++) { 
    if(grid[i][0]!=NULL) 
     rows++; 
    else { 
     break; 
    } 
    } 
    if (!(rows == columns)) 
    return false; 
    for(int i=0;i<rows;i++) { 
    for(int j=0;j<columns;j++) { 
     if(grid[i][j]==NULL) { 
     return false; 
     } 
    } 
    } 
    return true; 
} 

Dieser Wert false zurück, und mein Programm beendet, obwohl das Eingangsgitter in diesem Fall gültig ist.

Ich kann nicht herausfinden, warum die checknxn Funktion in diesem Fall false zurückgibt.

UPDATE: Dies ist, wie ich meine Gitter initialisieren:

FILE *file1 = fopen(argv[1], "r"); // "r" for read 

    char grid[10][10]; 

    char c; 
    for(int i=0;i<10;i++){ 
    for(int j=0;j<10;j++){ 
     fscanf(file1,"%c", &c); 
     if (c == '\n') { 
     grid[i][j] = '\0'; 
     break; 
     } 
     if (c == ' ') { 
     grid[i][j] = '\0'; 
     continue; 
     } 
     if (c == '\0') { 
     grid[i][j] = '\0'; 
     continue; 
     } 
     else { 
     grid[i][j] = c; 
     } 
    } 
    } 
+0

Haben Sie Ihren Debugger versucht (oder sogar printf?). Angesichts Ihrer Eingabe kann ich sehen, warum es fehlschlägt.Beginnen Sie vielleicht damit, 'i' und' j' in 'row' und' col' umzubenennen, damit es einfacher zu folgen ist ... – John3136

+0

@ John3136 Ich habe meinen Debugger benutzt, um den Wert von grid zu überprüfen, habe ihn aber nicht benutzt es auf der checknxn Funktion, da ich nicht sicher bin, wie man gdb auf einer Hilfsfunktion benutzt. – RockAndaHardPlace

+0

treten Sie einfach hinein. – John3136

Antwort

1

Klassischer C-Fehler, Daten nicht zu initialisieren. Memset wahrscheinlich der Weg zu gehen (siehe unten).

memset(grid, 0, sizeof(grid[0][0]) * rows * columns); 
1

Ihr Gitter ist nicht voll initialisiert (Sie hat keine jede Zelle zB: \0), so dass Sie nur die Saiten und der Anfang jeder Zeile richtig definiert. Wenn Sie dies getan haben, initialisieren Sie das Raster, das heißt, Sie überprüfen nicht, ob die Zellen NULL sind, da es sich nicht um Zeiger, sondern um tatsächlichen Inhalt handelt. Wenn Sie das Raster auf diesen Wert initialisiert haben, suchen Sie beispielsweise nach: \0.

EDIT nach zusätzlichen Informationen aus dem OP

dass Gitter So initialisieren Sie so etwas wie

char grid[10][10]; 
for(int i=0;i<10;i++){ 
    for(int j=0;j<10;j++){ 
    grid[i][1j] = '\0'; 
    } 
} 

Und nur dann tun, um die Füllungen tun. Misch es nicht.

Wenn Sie überprüfen wollen, ob jede Zelle gefüllt ist, das heißt: nicht \0

for(int i=0;i<rows;i++) { 
    for(int j=0;j<columns;j++) { 
     if(grid[i][j] != `\0`) { 
     return false; 
     } 
    } 
    } 

Aber Sie wollen in C-String laden sie und C-Saiten mit einem \0 beenden. Entweder laden Sie die Strings in die Zellen ohne die nachfolgenden \0 oder passen Sie die Schleifen an, um bis row_length-2 statt row_length -1 zu überprüfen.

Ein viel einfacherer Ansatz, wenn Sie Strings haben: messen Sie die String-Länge in jeder Zeile und wenn sie alle gleich sind und die Anzahl der Zeilen der String-Länge entspricht, haben Sie ein quadratisches Gitter.

+0

Ich habe versucht, mein Raster zu initialisieren, um '\ 0's anstelle von NULLEN zu haben (siehe UPDATE oben) und meine checknxn Funktion, um das zu überprüfen, aber ich habe immer noch das gleiche Problem ... – RockAndaHardPlace