die zweite Zeichenfolge zu lesen, müssen Sie NULL
zu strtok()
passieren. Beachten Sie, dass fgets()
das Zeilenumbruchzeichen aus der Eingabezeile behält. Daher sollten Sie Ihre Begrenzerdefinition von char s[2] = " ";
in char s[] = " \r\n";
oder char s* = " \r\n"
ändern. Auf diese Weise enthält das zweite Token keine Newline-Zeichen. Beachten Sie auch, dass strtok()
einen Zeiger NULL
zurückgibt, wenn kein Token gefunden wird, also testet der unten stehende Code vor dem Drucken der Lesetoken dies.
Aber da Sie sagen, dass es nur zwei Strings gibt, würde ich nur sscanf()
dafür verwenden. Unter Verwendung des %s
Konvertierungsspezifizierers liest sscanf()
Zeichen in eine Zeichenfolge, bis ein Leerzeichen gefunden wird. Dieses Leerzeichen wird jedoch nicht in die Zeichenfolge eingeschlossen. Wenn Sie den Spezifizierer %s
in einer scanf()
-Funktion verwenden, sollten Sie eine maximale Feldbreite angeben, um Pufferüberlauf zu vermeiden. Diese maximale Breite sollte um eins kleiner sein als die Größe des Puffers, um in diesem Fall Platz für den '\0'
String-Terminator, zu lassen. Die Funktion sscanf()
gibt die Anzahl der erfolgreichen Zuweisungen zurück, die in diesem Fall sein sollten. Der unten gezeigte Ansatz (auskommentiert) sscanf()
überprüft diesen Rückgabewert vor dem Drucken der Zeichenfolgen.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_MAX 256
int main(void) {
char command[BUFFER_MAX];
char *token1 = NULL;
char *token2 = NULL;
const char *s = " \r\n";
fprintf(stdout, "$ Please enter a command \n");
fflush(stdout);
fgets (command, BUFFER_MAX, stdin);
token1 = strtok(command, s);
token2 = strtok(NULL, s);
if (token1 && token2 && strcmp(token1, "loaddungeon") == 0) {
fprintf(stdout, "$ loaded successfully: %s\n", token2);
fflush(stdout);
}
/* or instead do this */
/*
char word1[BUFFER_MAX], word2[BUFFER_MAX];
if (sscanf(command, "%255s %255s", word1, word2) == 2) {
if (strcmp(word1, "loaddungeon") == 0){
fprintf(stdout, "$ loaded successfully: %s\n", word2);
fflush(stdout);
}
}
*/
return 0;
}
Benutzereingabe kann "dfile.txt \ n" 'sein. Siehe http://stackoverflow.com/q/2693776/2410359 – chux