Fehlermeldung
-
Honky schrieb:
Ich bin noch(wie du wahrscheinlich bemerkt hast) blutiger Anfänger und bin noch nicht mit "normalen" Strings vertraut. Aber wenn du meinst, warte ich noch etwas mit meinem Programm und befasse mich mit strings.

Du verzichtest nicht auf strings, sondern benutzt nur die einfachere, sicherere und nicht zuletzt relevantere Variante und bastelst nicht mit C-Strings rum, denn das kommt, wie du siehst nicht gut.
btw:
Schau mal hier hat jemand gerade letztens eine nette Hangman Version programmiert:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-268133.html
-
Hi!
Ich habs mal "C++-mäßig" umgeschrieben.
Ausserdem hast du eine schöne Endlos-Schleife programmiert. Darum die Variable end_loop.mfg bernd
#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 >> eingabe; } else if(eingabe == 2) { end_loop = true; } } while(end_loop == true); cout << "Programm wird beendet..." << endl; return 0; }
-
@bauerb: Wohl eher andersrum mit dem end_loop. Jetzt läuft das Spiel nämlich nur so lange wie man "Spiel beenden" wählt
.
-
SeppJ schrieb:
@bauerb: Wohl eher andersrum mit dem end_loop. Jetzt läuft das Spiel nämlich nur so lange wie man "Spiel beenden" wählt
.Die Originalversion vom Honky hatte eine Endlosschleife produziert, wenn man zuerst "1" (Wort eingeben) gewählt hat. Die Variable loop_end hab ich reingeschrieben, um das Problem zu beheben. Jetzt läuft es so, wie es, meiner Meinung nach, sein sollte. Man kann beliebig oft ein neues Wort eigeben (Menüpunkt 1) und wenn man keine Lust mehr hat, das Programm mit Menüpunkt 2 beenden.
-
Dann solltest du end_loop aber auf false überprüfen

-
Oder besser wie im ersten Listing ganz darauf verzichten! Völlig überflüssig!
-
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.