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
-
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!
-
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 aberstrstr(befehl, wort)
falsch. Oderwort
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 aberstrstr(befehl, wort)
falsch. Oderwort
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; }