2017-01-14 10 views
5

Ich schrieb ein Programm zum Aufteilen einer Eingabezeichenfolge mit ';' als Terminator und drucke den Teil der Zeichenkette, der nach ';' Das Programm zeigt die korrekte Ausgabe an, wenn die Teilzeichenfolge ";" in der Eingabezeichenfolge ist kein gültiger Terminalbefehl, sondern gibt auch command not found aus. Auf der anderen Seite wird nichts gedruckt, wenn die Teilzeichenfolge von ';' ist ein gültiger Terminalbefehl und führt die Teilzeichenfolge als einen Befehl aus, z. Falls "sjhjh; ls" eingegeben wird, wird der Befehl ls ausgeführt.Das ';' Zeichen in der Eingabe wird fehlinterpretiert

Wie kann ich den command not found Teil loswerden? Hier ist der Code:

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

int main(int argc, char *argv[]) 
{ 
    char * input; 
    char * str; 
    char * word; 
    char terminator = ';'; 

    if (argc < 2) { 
     fprintf(stderr,"ERROR, no string provided\n"); 
     exit(1); 
    } 

    input = argv[1]; 
    word = strchr(input, terminator); 
    if (word != NULL) printf("%s\n", word); 
    return 0; 
} 
+1

Jungs, nicht diese Frage ablehnen. Es ist tatsächlich ein ziemlich seltenes und interessantes Beispiel für das Zusammenspiel zwischen der Shell und einer Anwendung. – DyZ

+1

schlagen vor, den Namen der Shell als Tag hinzuzufügen –

+2

@DYZ Ich werde nicht downvote, aber es ist tatsächlich ein Beispiel für die Verwendung des Debuggers oder die Erstellung eines MCVE. Sonst wäre es klar, dass der Text niemals den 'argv' in main erreicht und die Frage könnte einen ganz anderen Fokus haben. – grek40

Antwort

14

Wenn Sie Ihr Programm ausführen wie:

your_program_name sjhjh;ls 

auf der Kommandozeile, die Sie tatsächlich zwei Programme aufrufen. Die erste ist your_program_name sjhjh (so ist argv[1] ist "sjhjh"), und die zweite ist ls. Was Sie brauchen, ist sicherzustellen, dass der Rest der Befehlszeile von der Shell nicht geparst wird, und dies geschieht, indem es richtig zitiert:

your_program_name 'sjhjh;ls' 
+0

Außerdem könnte der OP den Code ein wenig straffen, indem er 'if (argc <2)' in 'if (argc! = 2)' umwandelt , die den Fehler gezeigt hätten. Der Code liefert nämlich nicht mehr als einen einzigen Parameter. Eine Gleichheitsprüfung wäre daher besser gewesen. @ Romy, wie Sie sehen können, nur genauer mit Ihrem Code kann Fehler für Sie erkennen, sogar vermeiden sie. Fragen Sie sich selbst, während Sie jede Codezeile schreiben: "Was genau versuche ich hier zu erreichen?" – Mawg

+3

@Mawg Halten Sie Ihre Pferde, die 'argc' Prüfung würde nichts verraten, weil' argv [1] 'kürzer wäre (ohne ';' und folgenden Text), aber es würde immer noch mit dem Text vor der ersten existieren '; " – grek40

+0

Du hast mich! (+1) Immer noch würde der Check Leerzeichen fangen, und obwohl es diesen Fehler nicht erfasst, ist es sicherlich ein etwas besserer Code. Der Hauptpunkt ist jedoch, wie Sie ausgeführt haben, zu lernen, einen Debugger zu verwenden. – Mawg

Verwandte Themen