String vergleichen!



  • Hi,
    Ich habe so ein Programm in dem der User wie in einer shell befehle eingeben kann!
    Ich werte die eingabe so aus:

    scanf("%s",&befehl);
     split(befehl," ",com1,com2);
    if(strcmp(com1.c_str(), "help") == 0)
    { /blablabla
    } else { printf("command not found");
    

    Die Funktion split trennt den string befehl einfach bei dem leerzeichen in com1 und com2 auf!
    so wenn ich nun help eingebe stürzt das programm ab, auch wenn garnichts in der klammer gemacht wird!
    Gebe ich einen nichtvorhandenen befehel ein wird auch wie oben "command not found" ausgegeben. Aber warum stürzt das programm ab wenn ich einen Befehl eingebe?
    Der Compiler bringt keine Fehlermeldung liegt es etwa darran das ich diese Funktion als thread starte?
    Ich starte die Funktion so:

    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)eingabe, 0, 0, 0);
    

    MFG ReduX



  • 1. Wenn du C++ benutzt, benutz doch std::string auch für die eingabe:

    std::string eingabe;
    std::getline(cin, eingabe);  /7 eine zeile von der tastatur lesen
    
    std::string cmd;
    
    size_t f = eingabe.find(" ");
    if(f != eingabe.npos)
      cmd = eingabe.substr(0, f);
    else
      cmd = eingabe;
    
    // in cmd steht jetzt das erste wort der zeile
    


  • Hi,
    Bringt nichts stürzt trozdem ab!
    Und möchte auch wenns möglich ist meine Variante beibehalten!

    MFG ReduX



  • Nimm die C++ Variante!
    Welchen Typ hat denn befehl?



  • Hi,
    Also befehl ist ein string.

    MFG ReduX



  • Da kannst du scanf doch gar nicht verwenden. Du schreibst dann irgendwo in die Klasseninstanz.
    Welche Signatur hat denn split? Ist das eine selbst geschrieben Funktion?



  • ReduX schrieb:

    Hi,
    Bringt nichts stürzt trozdem ab!
    ...

    Glaub' ich nicht (dass Maxi's Source einen Absturz verursacht) !

    Ich selbst würde sowieso "streamen" - entweder direkt von cin oder (wenn man die Zeilenstruktur beibehalten möchte) mittels istringstream. Vorteil: Beliebig flexibel, sicher und dabei kurz und übersichtlich (kein "Suchen nach Leerzeichen").

    vector<string> cmd;
    string eingabe;
    
    // Version 1: direkt von cin
    while(cin >> eingabe) cmd.push_back(eingabe); 
    
    // oder Version2: Zeilenweise via istringstream
    std::getline(cin, eingabe);
    istringstream in(eingabe);
    while(in >> eingabe) cmd.push_back(eingabe); 
    
    // in cmd[i] steht das i. Token drin
    

    Mit "Deiner Variante" wirst Du NIE sicherstellen können, dass jemand mehr Zeichen eingibt (sei es aus Versehen oder absichtlich), als befehl Zeichen hat oder den richtigen Typ oder .....
    Kurz gesagt: scanf() hat überhaupt keinen Vorteil aber einen Haufen Nachteile.

    BTW: "befehl ist ein String" meint was ? " char befehl[100]; " oder " std::string befehl; " ? Bei Letzterem ist vollkommen klar, warum
    a) Dir Dein Programm abstürzt und
    b) Du unbedingt eine typsichere Variante (wie von Maxi oder mir vorgeschlagen) verwenden solltest.

    Gruß,

    Simon2.


Anmelden zum Antworten