Fehlermeldung
-
Hi!
Ja klar... Im eiffer des Gefechtes...

#include <iostream> #include <string> using namespace std; int main() { string wort; int eingabe; int leben = 10; bool end_loop = false; do { cout << "Druecken sie '1' fuer ein neues Spiel!" << endl; cout << "Druecken sie '2' um das Programm zu beenden!" << endl; cin >> eingabe; if(eingabe == 1) { cout << "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): "; cin >> wort; } else if(eingabe == 2) { end_loop = true; } } while(end_loop == false); cout << "Programm wird beendet..." << endl; return 0; }
-
Bleibt trotzdem überflüssig und ist meiner Meinung nach auch nicht schöner.
Wie kommst du überhaupt darauf:Ausserdem hast du eine schöne Endlos-Schleife programmiert.
?
-
Ups.... Stimmt...
Hab den Wald vor lauter Bäumen nicht gesehen.
Hast natürlich recht. Muss mich entschuldigen. Keine Endlosschleife... Sorry
-
Aber was verursacht denn nun diesen Fehler.
Ich denke ja dass diese Zeilestrncat(carray, '\0', 1);daran schuld ist. Ich habe es auch mit folgendem Probiert:
carray[sizeof(carray)-1] = '\0';doch dann scheint der C-String trotzdem kein Terminierungszeichen zu enthalten, da dann strlen ins unendliche zählt.
Und ich meine als angehender (Hobby-)Programmierer sollte man sich doch mit C-Strings genau so gut aukennen wie mit den C++ Strings. Oder nich?
-
Nochmals:
- strncat funktioniert so nicht. Guck dir die Doku nochmal an. Hier mal ein paar Warnungen die mein Compiler zu dem Code hat:
test.cc: In function 'int main()': test.cc:22: warning: null argument where non-null required (argument 2) test.cc:22: warning: null argument where non-null required (argument 2) test.cc:23: warning: comparison between signed and unsigned integer expressions test.cc:10: warning: unused variable 'leben'2. getline funktioniert so nicht. Guck dir die Doku nochmal an.
The ending null character that signals the end of a c-string is automatically appended to s after the data extracted.
Honky schrieb:
Und ich meine als angehender (Hobby-)Programmierer sollte man sich doch mit C-Strings genau so gut aukennen wie mit den C++ Strings. Oder nich?
3. Wozu? Das alles hat man in C++ überhaupt nicht nötig. Guck dir die Doku nochmal an. Ich erwarte auch nicht, dass mein Automechaniker weiß wie man einem Pferd ein Hufeisen verpasst.
-
OK, guter vergleich^^
-
Honky schrieb:
OK, guter vergleich^^
ich hoff ja immernoch, dass iwann mal nen neuer toller vergleich kommt - langsam wirds langsam mit der pferd/auto-geschichte

-
Naja, das Problem mit der Terminierung hab ich jetz begriffen, nur hab ich jetzt noch ein Problem. Meine for-Schleife wird einfach übergangen??? Warum?
Liegt das etwa an meiner IDE? (benutze codeBlocks)
-
Hy
Wie übergangen? was meinst du damit?
Nur so nebenbei solange du es einfach ausführst kann es nicht an der IDE liegen weil diese dir
unter die Arme greift in Sachen Projekt Zusammenstellung und Aufruf des Compilers. Und bei guten
noch etwas Syntax-Highligting und IntelSense aber mehr auch nicht.Im Debugging Modus könnte es sein, das dir die IDE das falsche anzeigt, aber ich kann mich nicht
erinnern das ich das jemals Probleme mit CodeBlocks hatte und ich benutzt es schon seit langem.Mfg marco
-
Honky schrieb:
Naja, das Problem mit der Terminierung hab ich jetz begriffen, nur hab ich jetzt noch ein Problem. Meine for-Schleife wird einfach übergangen??? Warum?
Aktuellen Code zeigen!
Liegt das etwa an meiner IDE? (benutze codeBlocks)
Nein.
-
Ich habe die C-Strings nicht weggelassen, da es ja auch mit ihnen realisierbar sein müsste.
#include <iostream> #include <cstring> using namespace std; int main() { char* carray[30]; int eingabe; bool end_loop = true; do { cout << "Druecken sie '1' fuer ein neues Spiel!" << endl; cout << "Druecken sie '2' um das Programm zu beenden!" << endl; cin >> eingabe; if(eingabe == 1) { cout << "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): "; cin.getline(carray, sizeof(carray)); for(signed int i = 0; i < strlen(carray); i++) { cout << "-"; } } else { end_loop = false; } } while(end_loop == true); cout << "Programm wird beendet..." << endl; return 0; }Ich glaube ich habe mich falsch ausgedrückt, die for-schleife wird nicht übergangen, ich habe es jedoch geschafft irgendwo eine endlosschleife einzubauen. Wenn ich das nun Compiliere und 1 drücke wird erstmal ausgegeben:
"Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): " Direkt dahinter werden dann wieder die anweisungen drücke 1 oder 2 gestellt. (Warum)
Gebe ich dann ein Wort/Buchstabe ein lauft das Programm unendlich durch.
-
while(end_loop == true);Als erstes:
Du brauchst der Anweisung nicht zu sagen, das sie "Wahr" sein soll, du kannst also einfach
while(end_loop);schreiben.
So wie die Schleife jetzt aufgebaut ist, würdest du das Programm beenden, wenn du bei der ersten Eingabe keine 1 gemacht hast. Ist das Sinn und Zweck?
Ich würde dasend_loop = falsein die "true" Bedingung setzen, würde zumindest meiner Meinung nach mehr Sinn ergeben

würde dann in etwa so aussehen:
#include <iostream> #include <cstring> using namespace std; int main() { char* carray[30]; int eingabe; bool end_loop = true; do { cout << "Druecken sie '1' fuer ein neues Spiel!" << endl; cout << "Druecken sie '2' um das Programm zu beenden!" << endl; cin >> eingabe; if(eingabe == 1) { cout << "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): "; cin.getline(carray, sizeof(carray)); for(signed int i = 0; i < strlen(carray); i++) { cout << "-"; } end_loop = false; } } while(end_loop); cout << "Programm wird beendet..." << endl; return 0; }
-
Und mit
std::stringwäre der Code dann sogar schön und sicher.
-
Nur mein Problem bleibt.
Ich komme nicht zur eingabe des Wortes.
-
Honky schrieb:
Nur mein Problem bleibt.
Ich komme nicht zur eingabe des Wortes.Und ich kann's nnoch nicht einmal compilieren. Denn es ist einfach totaler Mist und das müsste dir dein Compiler auch sagen:
char* carray[30];Das ist ein Array von char*. Das ist kein C-String! Entsprechend gehen auch alle späteren Stringoperationen schief:
test.cc: In function ‘int main()’: test.cc:22: [b]error: no matching function for call to ‘std::basic_istream<char, std::char_traits<char> >::getline(char* [30], long unsigned int)’[/b] /usr/include/c++/4.4/istream:593: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/c++/4.4/istream:405: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>] test.cc:24: [b]error: cannot convert ‘char**’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’ [/b]Das alles würdest du dir sparen, wenn du endlich std::string benutzen würdest. Das ist irgendwie als wenn du zum Arzt gehst und jammerst, dass dein Kopf weh tut, wenn du vor die Wand läufst. Da kann man eben nur antworten, dass du aufhören sollst absichtlich vor die Wand zu laufen.
edit: So ungefähr wolltest du es wohl haben. Man könnte das ganze natürlich noch besser machen, indem man auf Fehleingaben reagiert, aber wir wollen für den Anfang mal nicht übertreiben:
#include <iostream> #include <string> using namespace std; int main() { int eingabe; do { cout << "Druecken sie '1' fuer ein neues Spiel!" << endl; cout << "Druecken sie '2' um das Programm zu beenden!" << endl; cin >> eingabe; if(eingabe == 1) { cout << "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): "; string str; cin >> str; // So leicht kann das sein. for(unsigned int i = 0; i < str.size(); i++) // Warum signed, wenn i doch ganz klar nur positiv sein kann? { cout << "-"; } cout<<endl; // Neue Zeile nach den ----, das sieht hübscher aus. } } while(eingabe!=2); // Wozu das Gefrickel mit end_loop? cout << "Programm wird beendet..." << endl; return 0; }
-
Das mit dem char-Zeiger war ein versehen, hab ich in meinem eigenen code auch nicht rein machen wollen.
Und das mit dem end_loop wurde mir von anderen vorgeschlagen. Zuvor hatte ich auch die abfrage mit
while(eingabe !=2);Und zu den C-Strings: Wenn es wirklich so schlimm ist, dass ich C-Strings benutze, dann lass ich es eben bleiben. Ich dachte nur es müsste auch mit diesen gehen.
Trotzdem danke
PS: Was benutzt du denn für ne IDE
-
Honky schrieb:
Und zu den C-Strings: Wenn es wirklich so schlimm ist, dass ich C-Strings benutze, dann lass ich es eben bleiben. Ich dachte nur es müsste auch mit diesen gehen.
Klar geht es, aber es ist einiges umständlicher, als mit
std::string.
-
Honky schrieb:
Und zu den C-Strings: Wenn es wirklich so schlimm ist, dass ich C-Strings benutze, dann lass ich es eben bleiben. Ich dachte nur es müsste auch mit diesen gehen.
Geht auch, ist aber schwieriger. Warum sich das Leben absichtlich schwer machen?
PS: Was benutzt du denn für ne IDE
Emacs, warum?
-
Nur so, bin interessiert was sonst noch so gängig ist!