2016-08-27 3 views
-2

Ich denke, das Problem meines Codes ist mit meinem Fgets, aber ich weiß nicht, wie es zu beheben ist. Also, wenn ich die Funktion zum ersten Mal aufrufen, funktioniert alles, aber wenn zum zweiten Mal, die Funktion überspringt alles nach dem Drucken.fgets, die beim zweiten Aufruf überspringen würden

So würde der Ausgang sein:

Output: 
Please enter x and y coordinates separated by a comma for the piece you wish to enter: 3,4 
x: 3, y:4 
Please enter x and y coordinates separated by a comma for the piece you wish to enter: x: 
, y: 

Dies ist der Code:

void functioncall() 
{ 
    char coord[4]; 
    printf("Please enter x and y coordinates separated by a comma for the piece you wish to place: "); 
    fgets(coord, 4, stdin); 

    char *xcoord = strtok(coord, ","); 
    char *ycoord = strtok(NULL, " "); 
    if (!ycoord) 
    { 
     ycoord = ""; 
    } 

    printf("x: %s, y: %s\n", xcoord, ycoord); 
} 

Ich kann nicht einen Eingang geben, wenn es zum zweiten Mal aufgerufen wird.

+2

Ihr String ist viel zu klein und kann nicht in den Zeilenumbruch passen, so dass das nächste 'fgets()' nur den Zeilenumbruch erhält. Ändere 4 zu 4096! –

+0

@ JonathanLeffler Ich habe versucht, eine größere Zahl vor, aber es funktioniert – PPasf

+1

In welcher Weise hat es nicht funktioniert? Sie sollten auch überprüfen, dass 'fgets()' einen Nicht-Null-Zeiger zurückgibt, da dies EOF meldet. Beachten Sie, dass Sie Probleme haben, wenn jemand '23,45 'eingibt. oder "-1, + 1". –

Antwort

1

Der Grund für das angezeigte Verhalten ist die Größe des Arrays coord. Wenn Sie die Größe 4 angeben, bedeutet dies, dass Sie 1 Ziffer, 1 Komma, 1 Ziffer und 1 Nullbyte speichern können. Dadurch bleibt kein Platz für den Zeilenumbruch, sodass der zweite Aufruf der Funktion den Zeilenumbruch liest (nur), die nicht gut analysieren.

Sie sollten viel mehr Platz einplanen - Benutzer sind endlos erfinderisch in was sie schreiben (führende Leerzeichen, abschließende Leerzeichen, Zwischen Leerzeichen, Zeichen, führende Nullen, etc.). Ich neige dazu, 4096 für einzelne Zeilen der Eingabe zu verwenden - teilweise für den Schockwert, und auch, wenn jemand bereit ist, einen 4-seitigen Aufsatz in einer einzigen Zeile zu schreiben, verdienen sie, was sie bekommen.

Dieser Code funktioniert für mich:

Beispiel Lauf (Programmname cd19, die Quelldatei cd19.c):

$ ./cd19 
Please enter x and y coordinates separated by a comma for the piece you wish to place: 234 , 495 
x: [234] y: [495] 
Please enter x and y coordinates separated by a comma for the piece you wish to place: 1,2 
x: [1] y: [2] 
$ 

Die Wahl der Trennzeichen stellt sicher, dass das 234 , 495 Beispiel OK arbeitet (die Tab ist optional, aber nicht unbedingt eine schlechte Idee). Es bedeutet jedoch, dass der Benutzer kein Komma eingeben muss.

Verwandte Themen