2010-11-18 9 views
0

Was ich tun möchte, ist ein Terminal-Menü zu erstellen, das verschiedene Arten von Argumenten nimmt und es in einem Array-Parameter platziert. Unten ist der Code: Hier sind einige Probleme, die ich habe und kann keine gute Lösung für finden.Erstellen eines Terminal-Menüs mit einer Abfrage

wenn ich nur 'list' schreibe, bekomme ich keinen gültigen Befehl, ich muss "list" (list und space) eingeben. Menüwahl neu sollte so sein: neu "Mein Name ist Hallo". param [0] = new und param [1] = Mein Name ist hallo, (sow ich kann eine Nachricht mit Leerzeichen erstellen).

Wie kann ich das erreichen?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <limits.h> 

int menu() 
{ 
    printf(">"); 

    char line[LINE_MAX]; 
    int i = 0; 
    char *param[4]; 

    while(fgets(line, LINE_MAX, stdin) != NULL) { 
     param[i++] = strtok(line, " \n"); 

     if(param[0] != NULL) { 
      char *argument; 

      while((argument = strtok(NULL, "\n")) != NULL) { 
       param[i++] = argument; 
      } 
     } 

     if(strcmp(param[0], "new") == 0) { 
      //new(param[1]); 
      menu(); 

     } else if(strcmp(param[0], "list") == 0) { 
      //list(); 
      menu(); 

     } else { 
      printf("Not a valid command.\n\n"); 
      menu(); 
     } 
    } 

    return 0; 
} 

Antwort

0

Ich bin mir nicht sicher, ob dies Ihr Problem verursacht, aber diese Zeilen

 /*new(param[1]); 

     /*list(); 

Kommentar starten, die nie beendet.

Wenn Sie eine Zeile Kommentare können Sie verwenden:

 // comment 

(atleast in C++ und von C99 auf)

Aber Kommentare mit /* beginnen müssen mit einem */ und nicht verschachtelt beendet werden:

Da Sie einen Kommentar in einem Kommentar starten, sollte Ihr Compiler eine Warnung ausgegeben haben, eigentlich sollte dies überhaupt nicht kompiliert werden .

+0

Hmm jetzt wurde es weg geschnitten ...aber was ist, wenn es irgendwie mit der Ursache des Problems zusammenhängt? –

+0

Hallo .. Sorry, meine Schuld ist jetzt. Ich habe diese Funktionen auskommentiert, um den Code zu kompilieren. – user265767

+0

Entschuldigung wegen der Bearbeitung. Das obige Programm leidet unter vielen Problemen (einschließlich Programmlogik) und das Ändern dieser Kommentare ist notwendig. Aber keine Beziehung zu der Frage: die Frage nach Sachen, die vor den Zeilen mit den Kommentaren stehen. – pmg

1

Sie begrenzen auf "".

fgets liest die ENTER.

Wenn Sie also "listENTER" eingeben und an Leerzeichen tokenisieren, erhalten Sie einen Token, nämlich "listENTER". Später vergleichen Sie mit "Liste" und natürlich stimmt es nicht überein.

Versuchen

strtok(line, " \n"); /* maybe include tabs too? */ 

PS. Warum rufst du menu rekursiv an? Sie haben bereits eine while in der Funktion ...

+0

danke. Dies wird eines der Probleme lösen! Wie kann ich das Menü dazu bringen, alles zwischen "dies, auch wenn es Platz ist" in param [] zu setzen? – user265767

+0

Vielleicht stellen Sie eine neue Frage ... Sie müssen 'param' überprüfen. Es hat Platz für 4 Zeiger; Deine Zeichenfolge hat viel mehr als 4 Token. – pmg

+0

Sie haben missverstanden. gegeben folgenden Befehl: new "mein Name ist", param [0] = neu, param [1] = mein Name ist. – user265767

1

Ihr Problem ist param [i ++] = strtok (line, ""); wird nur auf Leerzeichen aufgeteilt, nicht auf \ n (Zeilenumbruch). Versuchen Sie, dieses zu Ihrem Delimeter-Array hinzuzufügen.

Oh, und herzlichen Glückwunsch für einen anständigen Code, der sauber und gut formatiert ist. Eine angenehme Abwechslung.

0

Der Grund, warum Sie "list" eingeben müssen, ist, dass Ihre erste strtok bis zu einem Leerzeichen Zeichen tokenisiert, so dass Sie in diesem Fall eine eingeben müssen. Versuchen Sie, sowohl '\n' als auch Leerzeichen als Trennzeichen zuzulassen, d. H. Ersetzen Sie den zweiten Parameter strtok durch " \n".

Wie für Anführungszeichen müssen Sie Parameter neu kombinieren, beginnend bei dem mit einem Zitat beginnenden bis zum Ende mit einem, indem Sie die Zeichen zwischen ihnen durch Leerzeichen ersetzen. Oder entfernen Sie strtok und parsen Sie, indem Sie manuell die Zeichen in line durchlaufen.

Verwandte Themen