strstr kann nur das erste Wort "finden"



  • Hallo miteinander,
    wenn ein paar von euch meine Threads in den letzten Wochen verfolgt haben, wisst ihr ja was ich versuche 😃 Habe mich jetzt genug eingelesen und bin jetzt gaaanz wo anders hängen geblieben:

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    
    // Zweiter Schritt - Eingabe in Prio
    string auswertung(char befehl[200]){
    	string error="Ich habe dich leider nicht verstanden!";
    	string roger="Befehl verstanden und weitergeleitet!";
    
    	if(strstr(befehl, "test"))
    	// das !=0 kann auch weggelassen werden
    	   {
    	   return roger;
    	   }
    	else
    		{
    		cout << befehl << endl;
    		return error;
    
    		}
    }
    
    // Main
    int main() {
    	cout << "ZOEY ist online\n" << endl; // prints ZOEY comes up
    	cout << "Hey Sir" << endl;
    	cout << "Was kann ich für dich tun?" << endl;
    	char befehl[200];
    	cin >> befehl;
    	cout << auswertung(befehl) << endl;
    
    	return 0;
    }
    

    Wenn ich "das ist ein test" eingebe, dann bekomm ich ein "error-return".... wenn ich "test ist hoffentlich erfolgreich" eingabe, dann kommt das "roger-return"... Also muss das erste Wort irgendwie immer test sein, ansonsten kann das Programm das Wort "test" im String nicht finden? Wie finde ich dann ein Wort im String? Also dass ich bei beiden Eingaben ein roger bekomme?

    Das Problem liegt offensichtlich irgendwo bei den Leerzeichen oderso :0 Denn durch das hinzufügen von

    cout << befehl << endl;
    

    habe ich herausgefunden, dass nur das erste Wort ausgegeben wird :0

    Ich habe am Anfang anstatt "char befehl[200]", "string befehl"
    genutzt. Gab allerdings Fehler.....

    Wo is des Problem und wie löse ich es?

    Marc



  • autsch autsch autsch. wieso arbeitest du in der einen hälfte mit cstrings und in der anderen mit richtigen c++-strings? mach alles zu c++-strings und dein problem wird sich von selbst erledigen.



  • asfdlol schrieb:

    autsch autsch autsch. wieso arbeitest du in der einen hälfte mit cstrings und in der anderen mit richtigen c++-strings? mach alles zu c++-strings und dein problem wird sich von selbst erledigen.

    Dürfte daran liegen, dass ich überwiegend C gelernt habe 😛
    Aber ich verstehe nicht ganz? Wo sind hier C-Strings die man so in C++ nicht nutzen kann?



  • M4RC schrieb:

    asfdlol schrieb:

    autsch autsch autsch. wieso arbeitest du in der einen hälfte mit cstrings und in der anderen mit richtigen c++-strings? mach alles zu c++-strings und dein problem wird sich von selbst erledigen.

    Dürfte daran liegen, dass ich überwiegend C gelernt habe 😛
    Aber ich verstehe nicht ganz? Wo sind hier C-Strings die man so in C++ nicht nutzen kann?

    Das war nur eine Panik-Reaktion, nicht so ernst nehmen, strstr und string in einer Funktion zusammen, ist halt ungewöhnlich, hat hier baer nix mit dem Problem zu tun.

    Aber mach doch mal

    cin >> befehl;
        cout<<"Befehl: "<<befehl<<'\n';
        cout << auswertung(befehl) << endl;
    

    Umstellen nach <string>, ein wenig <algorithm> und kein <string.h> ist keine so schlechte Idee.



  • Das war nur eine Panik-Reaktion, nicht so ernst nehmen, strstr und string in einer Funktion zusammen, ist halt ungewöhnlich, hat hier baer nix mit dem Problem zu tun.

    Aber mach doch mal

    cin >> befehl;
        cout<<"Befehl: "<<befehl<<'\n';
        cout << auswertung(befehl) << endl;
    

    Umstellen nach <string>, ein wenig <algorithm> und kein <string.h> ist keine so schlechte Idee.[/quote]

    Ich habe alles getan was du von mir verlangt hast :p
    Warum liest er immer nur das erste Wort ein?!
    Kleines Terminalbeispiel:

    Hey Sir
    Was kann ich für dich tun?
    das ist ein test
    Befehl: das
    das
    Ich habe dich leider nicht verstanden!

    Dafuq???



  • die eingabe wird beim ersten whitespace-charakter unterbrochen. wenn du alles bis zum zeilenumbruch (enter-taste) haben willst, musst du std::getline nehmen: http://www.cplusplus.com/reference/string/string/getline/
    oder wenn du weiterhin mit cstrings arbeiten willst, dann std::cin.getline
    http://www.cplusplus.com/reference/istream/istream/getline/



  • asfdlol schrieb:

    die eingabe wird beim ersten whitespace-charakter unterbrochen. wenn du alles bis zum zeilenumbruch (enter-taste) haben willst, musst du std::getline nehmen: http://www.cplusplus.com/reference/string/string/getline/
    oder wenn du weiterhin mit cstrings arbeiten willst, dann std::cin.getline
    http://www.cplusplus.com/reference/istream/istream/getline/

    Perfekt! Danke! Geht doch!! :))))



  • Hey Leute,

    noch ein kleines Problem... Habe keine Lust deshalb noch eine Diskussion anzufangen 😉 Müssen ja keine 20 Threads erstellen 😃

    int prio(char befehl[200], int wort, int wk)
    {
    	if(strstr(befehl, wort))
    	{return wk;} else {return 0;}
    }
    

    Wieso mag mich Eclipse nicht für diesen Code?

    error: initializing argument 2 of ‘int prio(char*, int, int)’ [-fpermissive]

    Das is wohl der Fehler dazu, der meiner Meinung nach voll keinen Sinn macht...

    Marc


  • Mod

    M4RC schrieb:

    Das is wohl der Fehler dazu, der meiner Meinung nach voll keinen Sinn macht...

    Da fehlt ja auch eine Zeile, nämlich die interessante, vorhergehende Zeile. Dies sagt dir nur, das der Fehler gefunden wurde, in einem Ausdruck, der diese Funktion aufrufen möchte. Der Fehler liegt aber beim Aufruf und hat nichts mit dieser Funktion hier zu tun. Oder so könnte man meinen, wenn man nur nach dem technischen Fehler sucht. Denn wenn ich mir deine Funktion so ansehe, vermute ich mal, dass wort hier wohl kein int sein soll und der Aufrufcode hier auch keinen int übergibt.

    P.S.: Wenn du schon C-Strings benutzt, dann sei wenigstens const-correct. Oder besser noch: Benutze C++-Strings und const-correctness.



  • SeppJ schrieb:

    M4RC schrieb:

    Das is wohl der Fehler dazu, der meiner Meinung nach voll keinen Sinn macht...

    Da fehlt ja auch eine Zeile, nämlich die interessante, vorhergehende Zeile. Dies sagt dir nur, das der Fehler gefunden wurde, in einem Ausdruck, der diese Funktion aufrufen möchte. Der Fehler liegt aber beim Aufruf und hat nichts mit dieser Funktion hier zu tun. Oder so könnte man meinen, wenn man nur nach dem technischen Fehler sucht. Denn wenn ich mir deine Funktion so ansehe, vermute ich mal, dass wort hier wohl kein int sein soll und der Aufrufcode hier auch keinen int übergibt.

    P.S.: Wenn du schon C-Strings benutzt, dann sei wenigstens const-correct. Oder besser noch: Benutze C++-Strings und const-correctness.

    int wort ist natürlich eine Zahl! Die Zahl steht nur für ein Wort als Platzhalter 😃 Complicated.... Nagut, dann check ich nochmal den Aufruf! Danke!


  • Mod

    M4RC schrieb:

    int wort ist natürlich eine Zahl! Die Zahl steht nur für ein Wort als Platzhalter 😃 Complicated.... Nagut, dann check ich nochmal den Aufruf! Danke!

    Irgendwie entgeht mir hier Ironie oder ich verstehe deine Schlussfolgerung nicht. Entweder soll wort wirklich eine Zahl sein, dann ist aber strstr(befehl, wort) falsch. Oder wort soll doch keine Zahl sein, dann ist der Aufruf aber richtig und die Funktion falsch.



  • SeppJ schrieb:

    M4RC schrieb:

    int wort ist natürlich eine Zahl! Die Zahl steht nur für ein Wort als Platzhalter 😃 Complicated.... Nagut, dann check ich nochmal den Aufruf! Danke!

    Irgendwie entgeht mir hier Ironie oder ich verstehe deine Schlussfolgerung nicht. Entweder soll wort wirklich eine Zahl sein, dann ist aber strstr(befehl, wort) falsch. Oder wort soll doch keine Zahl sein, dann ist der Aufruf aber richtig und die Funktion falsch.

    Sorry hab mich vorhin vertan! Wort ist ein Wort! habs in char nun gewechselt!!

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    
    /* 			Wortliste:
     * 			1. Hallo
     * 			2. Öffne Browser
     * 			3. Öffne Eclipse
     * 			4. Wetter
     * 			5. Facebook
     *
     */
    
    // Wörter Funktion
    int prio(char befehl[200], char wort[20], int wk[20]) {
    	if(strstr(befehl, wort)){return 1;} else {return 0;}
    }
    
    // Zweiter Schritt - Eingabe in Prio
    string auswertung(char befehl[200]){
    
        string error="Ich habe dich leider nicht verstanden!";
        string roger="Befehl verstanden und weitergeleitet!";
    
        if(strstr(befehl, "test")){return roger;}
        //Beispieleintrag
        int wk=201;
        cout << prio("Das ist ein Test", "wort", wk);
        return "okay";
    }
    
    // Main
    int main() {
    	//Start
    	char befehl[200];
    	while(befehl != "exit"){
        cout << "ZOEY ist online\n" << endl; // prints ZOEY comes up
        cout << "Hey Sir" << endl;
        cout << "Was kann ich für dich tun?" << endl;
    
        cin.getline (befehl,200);
        cout << auswertung(befehl) << endl;
    	}
    
        return 0;
    
    }
    

    Schauts euch bitte nocheinmal insgesamt an 🙂

    Log:

    g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/ZOEY.d" -MT"src/ZOEY.d" -o "src/ZOEY.o" "../src/ZOEY.cpp"
    ../src/ZOEY.cpp: In function ‘std::string auswertung(char*)’:
    ../src/ZOEY.cpp:45:48: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
         cout << prio("Das ist ein Test", "wort", wk);
                                                    ^
    ../src/ZOEY.cpp:45:48: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    ../src/ZOEY.cpp:45:48: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
    ../src/ZOEY.cpp:31:5: error:   initializing argument 3 of ‘int prio(char*, char*, int*)’ [-fpermissive]
     int prio(char befehl[200], char wort[20], int wk[20]) {
         ^
    ../src/ZOEY.cpp: In function ‘int main()’:
    ../src/ZOEY.cpp:59:18: warning: comparison with string literal results in unspecified behaviour [-Waddress]
      while(befehl != "exit"){
                      ^
    make: *** [src/ZOEY.o] Fehler 1
    
    19:46:22 Build Finished (took 260ms)
    


  • Auf consrt gehe ich mal nicht ein.

    #include <iostream>
    #include <string>
    #include <cstring>
    //#include <stdio.h>
    #include <algorithm>
    using namespace std;
    
    /*          Wortliste:
     *          1. Hallo
     *          2. Öffne Browser
     *          3. Öffne Eclipse
     *          4. Wetter
     *          5. Facebook
     *
     */
    
    // Wörter Funktion
    int prio(string befehl, string wort, int wk) {
    	if(befehl.find(wort)!=string::npos) {
    		return 1;
    	}
    	else {
    		return 0;
    	}
    }
    
    // Zweiter Schritt - Eingabe in Prio
    string auswertung(string befehl) {
    
    	string error="Ich habe dich leider nicht verstanden!";
    	string roger="Befehl verstanden und weitergeleitet!";
    
    	if(befehl.find("test")!=string::npos) {
    		return roger;
    	}
    	//Beispieleintrag
    	int wk=201;
    	cout << prio("Das ist ein Test", "wort", wk);
    	return "okay";
    }
    
    // Main
    int main() {
    	//Start
    	string befehl;
    	while(befehl != "exit") {
    		cout << "ZOEY ist online\n" << '\n'; // prints ZOEY comes up
    		cout << "Hey Sir" << '\n';
    		cout << "Was kann ich für dich tun?" << '\n';
    
    		getline(cin,befehl);
    		cout << auswertung(befehl) << '\n';
    	}
    
    	return 0;
    
    }
    

Log in to reply