Mehrmalige Eingabe mit while
-
Hallo Freunde von Bit und Byte,
ich muss folgende Aufgabe lösen:
Schreibe ein Programm, das immer wieder die Eingabe eines Wortes mit 5
Buchstaben fordert und erst Ruhe gibt, wenn es eine Eingabe aus 5 Zeichen
bekommen hat.Folgendes habe ich probiert:
#include <iostream> using namespace std; bool eingabe_wort_5(char wort[]){ int zaehler = 0; for (int i = 0; wort[i] != '\0'; i++){ zaehler += 1; } if (zaehler != 5){ cout << "Das Wort " << wort << " besteht aus " << zaehler << " Buchstaben. Nochmal." << endl; return true; } else{ cout << "Das Wort hat " << zaehler << " Buchstaben. Das Programm wird beendet." << endl; return false; } } int main(int argc, char** argv) { char wort[100]; do{ cout << "Wort eingeben: "; cin >> wort; eingabe_wort_5(wort); }while(true); return 0; }Problem ist:
Wenn ich genau 5 Buchstaben eingebe, bricht die Schleife nicht ab.
Was habe ich falsch gemacht ?
Ich bedanke mich im Voraus.
-
Zeile 27.
-
SG1 schrieb:
Zeile 27.
Ging ja schnell.
Jetzt weiß ich wo der Fehler liegt, aber komme nicht drauf was genau falsch ist.Es sollte solange wiederholt werden, solange die Bedingung true ( Eingabe ungleich 5) erfüllt ist.
-
Denkfehler schrieb:
Es sollte solange wiederholt werden, solange die Bedingung true ( Eingabe ungleich 5) erfüllt ist.
Die Bedingung kommt zwischen die Klammern.
while(true)hat quasi gar keine Bedingung - die Schleife wird solange wiederholt bis sie anderweitig abgebrochen wird (e.g. durchbreak).Kleiner Tipp, falls du Clang oder GCC verwendest: Siehst du eine Warnung wenn du die Definition zu
[[gnu::warn_unused_result]] bool eingabe_wort_5(char wort[]){ int zaehler = 0; for (int i = 0; wort[i] != '\0'; i++){ zaehler += 1; } if (zaehler != 5){ cout << "Das Wort " << wort << " besteht aus " << zaehler << " Buchstaben. Nochmal." << endl; return true; } else{ cout << "Das Wort hat " << zaehler << " Buchstaben. Das Programm wird beendet." << endl; return false; } }abänderst? Bei VC++ kommt statt dem
[[..]]-Attribut ein_Check_return_hin.
-
Deine Schleife läuft halt so lange, wie true true ist... also für immer. Trag 'ne andere Bedingung ein, und die Schleife bricht vielleicht auch ab.
-
Hmmm, hört sich alles so plausibel an, wenn man das von den anderen hört ( bzw. liest)... Vielen dank an der Stelle.
Arcoth schrieb:
Die Bedingung kommt zwischen die Klammern.
while(true)hat quasi gar keine Bedingung - die Schleife wird solange wiederholt bis sie anderweitig abgebrochen wird (e.g. durchbreak).SG1 schrieb:
Deine Schleife läuft halt so lange, wie true true ist... also für immer. Trag 'ne andere Bedingung ein, und die Schleife bricht vielleicht auch ab.
Hört sich logisch an.
Arcoth schrieb:
Kleiner Tipp, falls du Clang oder GCC verwendest: Siehst du eine Warnung wenn du die Definition zu
[[gnu::warn_unused_result]] ...abänderst? Bei VC++ kommt statt dem [[..]]-Attribut ein _Check_return_ hin.
Jawohl, der Compiler beschwert sich:
[Error] expected unqualified-id before '[' tokenHabe den Code folgendermaßen geändert:
#include <iostream> using namespace std; /*[[gnu::warn_unused_result]]*/ int eingabe_wort_5(char wort[]){ int zaehler = 0; for (int i = 0; wort[i] != '\0'; i++){ zaehler += 1; } return zaehler; } int main(int argc, char** argv) { char wort[100]; int zaehler; do{ cout << "Wort eingeben: "; cin >> wort; eingabe_wort_5(wort); if (eingabe_wort_5(wort) != 5){ cout << "Das Wort " << wort << " besteht aus " << eingabe_wort_5(wort) << " Buchstaben. Nochmal." << endl; } else{ cout << "Das Wort hat " << eingabe_wort_5(wort) << " Buchstaben. Das Programm wird beendet." << endl; } }while( eingabe_wort_5(wort) != 5); return 0; }Nicht gerade die elegenteste Lösung, aber das funktioniert schonmal.
-
Hast du
-std=c++11angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.
-
Arcoth schrieb:
Hast du
-std=c++11angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.In
CodeBlocks( mit TDM-GCC compiler, version 4.8.1) ist das Häkchen bei-std = c++11da.Visual Studio 2013mit_Check_return_meckert nicht.
-
Denkfehler schrieb:
Arcoth schrieb:
Hast du
-std=c++11angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.In
CodeBlocks( mit TDM-GCC compiler, version 4.8.1) ist das Häkchen bei-std = c++11da.Kompiliert der Code im Link auch nicht, der minimale?
-
Arcoth schrieb:
Denkfehler schrieb:
Arcoth schrieb:
Hast du
-std=c++11angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.In
CodeBlocks( mit TDM-GCC compiler, version 4.8.1) ist das Häkchen bei-std = c++11da.Kompiliert der Code im Link auch nicht, der minimale?
Nope. Compiler gibt folgende Fehlermeldung aus:
||=== Build: Debug in Test_Forum_GCC (compiler: GNU GCC Compiler) ===| ...\main.cpp|4|error: expected unqualified-id before '[' token| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|