problem mit test von variable auf inhalt
-
Und die Zeile 6 ist auch Fragwürdig und demzufolge auch die Zeile 20.
"default-int" wird von C++ nicht unterstützt.Welcher Compiler lässt sowas zu?
-
cin >> b
liest eine Zahl ein. Dabei hat die Wandlung von Zeichen die die Zahl repräsentiert zu einem int mit dem entsprechenden Wert schon stattgefunden. Da muss man nicht noch isdigit benutzen. Du verwendest isdigit hier falsch. isdigit macht etwas anderes.
Du solltest trotzdem überprüfen, ob das mit dem Einlesen richtig geklappt hat. Dazu hat so ein Stream einen Zustand, den man abfragen kann.
-
hm danke erstmal für eure hilfe.
wie teste ich denn ob die eingabe eine zahl ist am besten?
habe die anderen fehler behoben denke ich oder was macht mein programm so falsch?int zahl_pruefen( int testzahl ){ if (isdigit ( testzahl ) ) { cout << "Eingabe ist eine Zahl.\n"; return 0; } else { cout<< "Bitte eine Zahl eingeben!\n"; return 0; } }zu der frage mit dem compiler:
man gibt g++ algorytmus.cpp in das terminal ein. denke der compiler heißt g++?(ich nutze ubuntu)
-
hiho, so z.B.:
#include <iostream> using namespace std; int main() { int x = 0; cin >> x; if(cin.fail() == true) { cout << "fail, no int entered"; } /* Weitermachen kannst du danach z.B. so. Es kann allerdings sein, dass sync() bei dir nicht funktioniert, dann gibt es andere Möglichkeiten um weiter zu machen. */ cin.clear(); // Fehlerflags zurücksetzen. cin.sync(); // Zeichen im Puffer verwerfen. cin >> x; // nächste Eingabe geht wieder. return 0; }
-
ich bin ein stückchen weiter gekommen

mein jetziger code ist:void zahl_pruefen( int testzahl ){ if (isalpha ( testzahl ) == 0 ) { cout << "--\n"; } if (isalpha(testzahl) != 0 ) { cout << "Bitte eine Zahl eingeben!!!\n"; } } }jetzt wird wenigstens bei einer zahl erkannt dass es sich um eine zahl handelt und das programm lässt else aus und geht normal weiter. wenn ich aber einen buchstaben eingebe dann kommt nach "bitte b angeben:" folgender fehler: Segmentation fault und das programm bricht ab
EDIT: @Dweb das probier ich mal danke!
-
Du hast da glaub noch was falsch verstanden.
Wenn du bei
int a;einen Buchstaben eingibst, dann schlägt das fehl, und das cin-Objekt ist in einem Fehlerzustand (cin.fail() ist true), und die Variable x wird nicht verändert und behält ihren ursprünglichen Wert.
Dementsprechend trifft (fast) immer das
if(isalpha ( testzahl ) == 0)zu, da du die Variable x (wie ich oben beschrieben habe) ja gar nicht verändert hast,
und die Variable x somit noch den zufälligen Wert hat, der zufällig an ihrer Speicherstelle steht.PS:
- Es ist eher unwahrscheinlich, dass an dieser Speicherstelle zufällig ein ASCII-Wert steht der zu einem Buchstaben gehört,
deswegen hatte ich oben "(fast) immer" geschrieben.- In meinem obigen Post siehst du eine Möglichkeit, wie man den Fehlerzustand des cin-Objekts beheben kann.
-
danke dweb! das scheint ja zu funktioniern!
nur habe ich jetzt das nächste problem
habe eine schleife eingebaut die jetzt leider unendlich läuft...
hier die funktion zahl_pruefen:bool zahl_pruefen( int testzahl ){ if (cin.fail() == true){ cout << "Bitte eine Zahl eingeben!\n"; cin.clear(); cin.sync(); return false; } else {return true;} }und der abfrage teil aus main():
bool pruefen = false; //abfrage von den beiden zu prüfenden zahlen while (pruefen == false){ cout << "bitte a angeben: \n"; cin >> a; pruefen = zahl_pruefen (a); }der wartet jetzt wenn ich einmal eine falsche antwort eingegeben habe nichtmehr auf eine eingabe bei cin >> a;! (geht auch nicht wenn ich das ganze in main schreibe) da hab ich jetzt überhaupt keine ahnung woran das liegt! normal wartet das programm doch immer auf eine einfabe?!
PS: ich habe meinen letzten beitrag geschrieben als du deinen geschrieben hast
daher ist deiner noch nicht berücksichtigt gewesen
-
Ich sehe da keinen Fehler, das funktioniert bei tadellos so wie du es wolltest,
egal ob ich
- aslfkääa´ß+.0943 // Fehler
- abc // Fehler
- x // Fehler
- 123 // ok
eingebe.
Wenn der bei dir nicht mehr auf eine Eingabe wartet, wenn du 1x etwas falsches eingibst, dann funktioniert bei deinem System wohl das cin.sync() nicht.
Wenn dies der Fall ist, dann gibt es andere Möglichkeiten:http://c-plusplus.net/forum/viewtopic-var-t-is-111042.html
#include <iostream> using namespace std; bool zahl_pruefen( int testzahl ) { if (cin.fail() == true) { cout << "Bitte eine Zahl eingeben!\n"; cin.clear(); cin.sync(); return false; } return true; } int main() { int a; bool pruefen = false; while(pruefen == false) { cout << "bitte a angeben: \n"; cin >> a; pruefen = zahl_pruefen (a); } return 0; }
-
ha super! jetzt gehts einwandfrei!
hier der ganze code falls ihn nochmal jemand sehen will#include <iostream> #include <ctype.h> #include <cstdlib> #include <stdio.h> using namespace std; void wait () { // Setzte Puffergröße auf 0 (=> leere Puffer) setvbuf(stdin, NULL, _IONBF, 0); // Setze Puffergröße wieder auf die ursprüngliche Größe zurück setvbuf(stdin, NULL, _IOFBF, BUFSIZ); // Füge alle eingelesenen Zeichen in den Puffer bis ein Enter gedrückt wird // getchar() liefert dann das erste Zeichen aus dem Puffer zurück, welches wir aber ignorieren (interessiert uns ja nicht) getchar(); } bool zahl_pruefen( int testzahl ){ if (cin.fail() == true){ cout << "----------------------------------\nBitte eine Zahl eingeben!\n----------------------------------\n-------------NOCHMAL!-------------\n"; cin.clear(); return false; } else {return true;} } //#####################################------> _MAIN_ <------######################### main() { cout << "---------------------------------- \nkomischer algorytmus \n----------------------------------\n"; int a; int b; int c; bool pruefen = false; int i = 0; cout << "[ENTER] zum Starten!\n"; //abfrage von den beiden zu prüfenden zahlen while (pruefen == false ){ wait(); cout << "Bitte a angeben: \n"; cin >> a; pruefen = zahl_pruefen (a); i++; if (pruefen == false){ cout << "Das ist die " << i << ". falsche Eingabe!\n"; } } cout << "a ist " << a << " - [ENTER] zum Fortfahren!\n"; i = 0; //i zurücksetzten pruefen = false;//pruefen wieder auf false setzten damit die zweite schleife überhaupt in gang kommt while (pruefen == false){ wait(); cout << "Bitte b angeben: \n"; cin >> b; pruefen = zahl_pruefen (b); i++; if (pruefen == false){ cout << "Das ist die " << i << ". falsche Eingabe!\n"; } } int x = a;//zahlen für spätere ausgabe speichern int y = b; // begin des algorytmus while( a != b ){ if ( a < b ){ c = a;//a wird dubliziert a = b;//a wird b b = c;//b wird a bzw. c } if ( a > b ){ c = a - b; a = b; b = c; } } //a ist das Gesuchte! cout << "Der ggt der Zahlen " << x << " und " << y << " ist " << a << "! \n----------------------------------\n"; return 0; }danke an alle die gehalfen haben!
-
jetzt fehlen nurnoch ne ordentliche Einrückung und vor allem standardkoformes C++.
ctype.h und stdio.h sind alte C-Header, die kein gültiges C++ sind (d.h. DEIN Compiler akzeptiert die vermutlich, aber andere Compiler müssen die nicht kennen)
Die entsprechenden C++-Header sind <cctype> und <cstdio>Die Vergleiche mit true und false sind auch sinnlos - den mit true kannst du gleich weglassen, den mit false durch ein logisches NOT ersetzen.