std:String und Vergleiche (Anfängerfrage)



  • Hallo,

    ich lese in meinem kleinen Programm zeilenweise etwas aus einer Datei in einen std:String buffer. Nun möchte ich gerne einige Zeichen aus dem String vergleichen und überprüfen.

    Wenn ich nun z.B. sage:

    if(buffer[0]=="x"){...}
    

    (also ich will schauen, ob der 1. Buchstabe ein x ist)

    Dann bekomme ich immer die Fehlermeldung:
    ISO C++ forbids comparison between pointer and Integer

    Wie kann ich dies aber umghen?

    Vielen Dank für eure Hilfe!



  • if(buffer[0]=='x'){...}
    


  • Danke, das funktioniert soweit schon einmal. Dankeschön!

    Nun habe ich aber noch das Problem, dass ich gerne die einzelnen Tokens ausgeben lassen würde, mit zwei normalen String geht dies wohl, aber wie ist das bei einem std:string?

    Hat jemand dafür ein Beispiel? Wäre sehr nett von euch! Danke!



  • was ist bei dir ein "normaler" string? gibt es etwa unnormale strings 😃 ?

    wenn ich dich richtig verstanden habe (oder was meinst du mit tokens):

    std::string foo = "bar";
    cout<<foo;
    

    [EDIT]
    Ausgabe:

    bar
    

    [/EDIT]

    btw: es heißt "std**::s**tring" und nicht "std:String". achte auf den doppelten doppelpunkt und das kleine s in string.



  • Hast ja schon recht!
    Mit Tokens meinte ich eine Funktion wie strtok(), wo also aus dem String Wort für Wort einzeln zurückgeliefert wird.

    Wenn ich z.B. habe:

    std::string test = "Die ist ein Test";
    char* pToken = strtok(test, " ");
    

    Dann bekomme ich den Fehler:

    cannotconvert 'std::string' to 'char*' for argument '1' to 'char* strtok(char*, const char*)'

    Was mache ich da falsch?



  • germangeek schrieb:

    Hast ja schon recht!
    Mit Tokens meinte ich eine Funktion wie strtok(), wo also aus dem String Wort für Wort einzeln zurückgeliefert wird.

    Wenn ich z.B. habe:

    std::string test = "Die ist ein Test";
    char* pToken = strtok(test, " ");
    

    Dann bekomme ich den Fehler:

    cannotconvert 'std::string' to 'char*' for argument '1' to 'char* strtok(char*, const char*)'

    Was mache ich da falsch?

    das muss

    char* pToken = strtok(test.c_str(), " ");
    

    heißen. strtok() erwartet einen char* und keinen std::string. c_str() liefert einen char*. aber als c++-komplement würde ich dir empfehlen

    #include <sstream>
    //...
    istringstream isstr(test);
    std::string token;
    isstr>>token;
    

    stringstreams ähneln vom gebrauch her den i/o- (eingabe/ausgabe) streams.

    btw: pToken (UN) ist out! lieber das "p" weglassen. nVar wird auch nicht genommen, so als Beispiel.



  • /edit: Sorry, da hab ich wohl irgendwas verwechselt...

    /edit2:

    Lars Hupel schrieb:

    das muss

    char* pToken = strtok(test.c_str(), " ");
    

    heißen.

    nicht eher so?

    char* token = strtok((char*)test.c_str(), " ");
    

    Caipi



  • Mit dem Code von Lars Hupel funktioniert es auf jeden Fall sehr gut:

    #include <sstream>
    //...
    istringstream isstr(test);
    std::string token;
    isstr>>token;
    

    Nun habe ich aber noch eine allerletzte Frage, danach nerve ich auch nicht mehr weiter. verspochen! *g*
    Den token den ich dort geliefert bekomme, wie kann ich den denn jetzt mit einem String vergleichen?
    Also z.B. if(token=="test"){...}
    Vergleich geht so natürlich mal wieder nicht, wie macht man das aber dann?

    Bsw. wie kann kann ich eine Zahl im token zu einer normalen Integer umwandeln, so dass ich diese wieder ganz bequem weiterverwenden kann?

    Schonmal vielen Dank an alle, die mir bisher geholfen haben und es noch tun werden!!!



  • germangeek schrieb:

    Mit dem Code von Lars Hupel funktioniert es auf jeden Fall sehr gut:

    #include <sstream>
    //...
    istringstream isstr(test);
    std::string token;
    isstr>>token;
    

    Nun habe ich aber noch eine allerletzte Frage, danach nerve ich auch nicht mehr weiter. verspochen! *g*
    Den token den ich dort geliefert bekomme, wie kann ich den denn jetzt mit einem String vergleichen?
    Also z.B. if(token=="test"){...}
    Vergleich geht so natürlich mal wieder nicht, wie macht man das aber dann?

    Also wenn token vom Typ char*, dann zieh die funktion strcmp(const char*, const char*) zuhilfe. Der Return-Wert ihrer ist ist entweder kleiner als 0, gleich 0 oder größer als 0. Wenn der Returnwert gleich 0, dann sind die beiden strings gleichgroß. Ansonsten wenn der Return-Wert kleiner als 0, dann ist der zuerst übergebene String kleiner als der zweite und wenn der Return-Wert größer als 0, dann ist der zuerst übergebene String größer als der zweite.

    Bsw. wie kann kann ich eine Zahl im token zu einer normalen Integer umwandeln, so dass ich diese wieder ganz bequem weiterverwenden kann?

    Schonmal vielen Dank an alle, die mir bisher geholfen haben und es noch tun werden!!![/quote]
    Siehe C++-FAQ "Einmal Zahl nach String und zurück".

    Caipi



  • Caipi schrieb:

    /edit2:

    Lars Hupel schrieb:

    das muss

    char* pToken = strtok(test.c_str(), " ");
    

    heißen.

    nicht eher so?

    char* token = strtok((char*)test.c_str(), " ");
    

    Ich gebe dir voll und ganz Recht. Ich habe nicht daran gedacht, dass c_str() einen const char* zurückgibt.

    germangeek schrieb:

    Den token den ich dort geliefert bekomme, wie kann ich den denn jetzt mit einem String vergleichen?
    Also z.B. if(token=="test"){...}

    2 Fälle (token ist ein...)

    • std::string -> token=="test", liefert true wenn wahr und false wenn falsch
    • char* -> strcmp() siehe Caipis Posting.

    Achtung: Auf Groß- und Kleinschreibung achten! Beide Arten unterscheiden streng dazwischen!

    Caipi schrieb:

    Siehe C++-FAQ "Einmal Zahl nach String und zurück".

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=IntToString#Answ


Log in to reply