2017-01-18 5 views
0
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 

    char command[256]; 
    char *token; 
    const char s[2] = " "; 

    fprintf(stdout, "$ Please enter a command \n"); 
    fflush(stdout); 

    fgets (command, 256, stdin); 
    token = strtok(command, s); 

    if (strcmp(token, "loaddungeon") == 0){ 
     fprintf(stdout, "$ loaded successfully \n"); 
     fflush(stdout); 
    } 
} 

Ich versuche STRTOK zu verwenden, um die zweite Zeichenfolge der Eingabe abzurufen. Zum Beispiel, wenn die Eingabe "loaddungeon dfile.txt" ist, was ich erhalten möchte, ist die "dfile.txt". Meine Funktion kann die Zeichenfolge "loaddungeon" abrufen. Aber ich habe keine Ahnung, wie man den zweiten String "dfile.txt" bekommt. Kann mir jemand sagen, wie es geht?So erhalten Sie die zweite Zeichenfolge des Eingangs

(die Eingabe Betrachten immer „loaddungeon dfile.txt“.)

+1

Benutzereingabe kann "dfile.txt \ n" 'sein. Siehe http://stackoverflow.com/q/2693776/2410359 – chux

Antwort

1

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; 
} 
1

Jeder Aufruf zu strtok einen Zeiger auf das letzte Zeichen in der angegebenen Zeichenfolge gefunden zurückkehren (oder null, wenn keine Links). Um das zweite Token mit Leerzeichen als Trennzeichen abzurufen, müssen Sie zum zweiten Mal strtok aufrufen.

int main() 
{ 
    char command[256]; 
    char *token1 = NULL; 
    char *token2 = NULL; 
    const char s[2] = " "; 
    fprintf(stdout, "$ Please enter a command \n"); 
    fflush(stdout); 
    fgets(command, 256, stdin); 
    token1 = strtok(command, s); // now points to first word 
    if (NULL != token1) { 
     token2 = strtok(NULL, s); // now points to second word 
    } 
    if (NULL != token2) { 
     if (strcmp(token2, "loaddungeon") == 0){ 
      fprintf(stdout, "$ loaded successfully \n"); 
      fflush(stdout); 
     } 
    } 
} 
+0

Sie müssen zwei "Token-Zeiger" haben - vielleicht 'char * -Operation; char * Operand; '- und dann' operation = strtok (Befehl, \ n "); operand = strtok (NULL, "\ n"); '. Ich habe den Test weggelassen; es ist nicht schlecht, aber es ist nicht kritisch. Wenn Sie fortfahren, 'strtok (NULL," ... ") aufzurufen, wird weiterhin null zurückgegeben. (Standard sagt: _Die 'strtok'-Funktion sucht dann von dort nach einem Zeichen, das in der aktuellen Trennzeichenkette enthalten ist. Wenn kein solches Zeichen gefunden wird, erstreckt sich das aktuelle Zeichen bis zum Ende der Zeichenkette, auf die 's1' zeigt, und Nachfolgende Suchen nach einem Token werden einen Nullzeiger zurückgeben._ –

+0

Das ist ein völlig gültiger Punkt. Nachfolgende Aufrufe sollten fast immer in einer Schleife passieren. OP schlug jedoch vor, dass er erwartet, dass zwei Token vorhanden sind und er/sie nur den 2. – Pejman

+1

Nun, der Code vergleicht das erste Token mit 'loaddungeon' und möchte dann das zweite Token verwenden können, damit die Datei als Dungeon geladen wird.So denke ich, dass beide benötigt werden.Beachten Sie, dass die andere Antwort ist mit 'token1' und' token2', wo ich 'operator' und' operand' vermute, könnte es angebracht sein - aber die Wahl des Namens ist zu 100% Ihnen überlassen und solange sie anders sind, sollte es funktionieren Verwenden Sie auf jeden Fall 'z' und' fancy_pants_extra_lo ng_name' - aber ich würde denken, du bist fast so komisch wie ich. –

Verwandte Themen