Cin.Getline nur Zahlen erlauben
-
Swordfish schrieb:
std::string
Ist halt eine Frage der Vorgabe: Aus der Aufgabenbeschreibung handelt es sich um die Erweiterung einer vorherigen Lösung und fertige Funktionen dürfen nicht verwendet werden. Ergo soll das vermutlich so sein wie es ist.
Übrigens "...Vorzeichen schreiben kann..." bedeutet, dass nicht unbedingt ein "+" vorne dran steht.
-
ja ne, aber im OP
<string>
einbinden
-
So habe mich heute wieder ein wenig dran gehockt und versucht mich wieder einzuarbeiten.
Bin auch ein bisschen weiter gekommen.if (kette[0] >= 65||kette[1] >= 65){ cout << "Bitte geben Sie nur Zahlen ein"<<endl; cin.get(); }
Nur müsste ich das für 82 Stellen machen.
Gibt es da nicht ne andere Variante?
Mit Schleifen habe ich es irgendwie nicht zum laufen gebracht
Hat vlt einer ne Idee?
-
So zB. prüfst du, ob die Zeichenkette nur Ziffern enthält:
bool IsStrNum(const char* str) // für null-terminierte C-style strings { while(*str && *str >= 48 && *str <= 57 && ++str); return !*str; }
Zugegeben, etwas kompakt, aber versuch mal's zu verstehen
Achtung: Bei einer leeren Zeichenkette kommt auch true zurück, aber das sollte egal sein.
-
Wie soll ich auf Ideen kommen, ohne überhaupt den Code zu sehen, der nicht läuft.
-
Hä?
Der steht doch ganz oben eigentlich.
Aber ich ich poste ihn dann halt nochmal:#include <iostream> #include <string> using namespace std; int i,a,d,z; int vorzeichen,isstart; int main() { long int wert = 0, len; char kette [81] ; cout<< "Bitte geben Sie eine Zahl ein " <<endl; cin.getline (kette,81); len = strlen (kette); isstart = 0; vorzeichen = 1; if (kette[0]== '+') isstart = 1; if (kette[0]== '-'){ isstart = 1; vorzeichen = -1; } if (kette[0] <= 65||kette[1] >= 65||kette[2] >= 65||kette[3] >= 65||kette[4] >= 65||kette[5] >= 65||kette[6] >= 65||kette[7] >= 65||kette[8] >= 65||kette[9] >= 65||kette[10] >= 65||kette[11] >= 65||kette[12] >= 65){ cout << "Bitte geben Sie nur Zahlen ein"<<endl; cin.get(); } if (strlen(kette) > 11 ){ cout << "Bitte geben Sie eine kleinere Zahl ein"<<endl; cin.get(); } for (int i = isstart; i < len; i++) { wert = wert*10 + (kette[i]-'0'); } wert= wert*vorzeichen; cout<< wert; return 0; }
Das ist jetzt mein aktueller Stand.
-
Schön, dass du meinen Beitrag einfach ignorierst.
Oder kapierst du's einfach nicht? Wär ja nicht schlimm, aber sag's doch
-
Oh. Entschuldigung habe die Antwort überhaupt nicht gesehen
Sorry. Aber jetzt beim anschauen erkenne ich auch nur Bahnhof.
Zum einen weiß ich nicht was es sich mit dem bool Klasse auf sich hat.
Da hatten wir in der Uni noch nicht und wir dürfen nur das verwenden was wir schon behandelt haben.Zu meinem geposteten Ansatz:
Das komische ist, dass für große Zahlen dieser funktioniert.
Nur für Zahlen wie zum Beispiel "12" erkennt das Programm diese als einen Buchstaben. Woran liegt denn das?
Mit freundlichen Grüßen
-
Wenn du eigene Funktionen schreiben sollst, brauchst du oft auch nen Rückgabewert.
bool ist da nur logisch, das steht einfach für true/1 oder false/0.Grundlagen lernen bitte, das dauert nicht lange. Außer es ist die erste Sprache
Ich denke nicht, dass du das "<=" so willst?
if (kette[0] <= 65||kette[1] >= 65||
Außerdem ist es völlig schwachsinnig, das nicht in einer Schleife zu machen.
-
Das ist ja das Problem.
Ist meine erste Programmiersprache.
Das mit dem Größerzeichen hatte ich falsch kopiert gehabt.
Im richtigen Code steht es richtig. Aber ich frage noch immer warum dies für kleine Zahlen nicht geht, sondern nur für große Zahlen diese als Zahlen erkannt werden. Ich weiß auch dass es nicht die schönste Lösung ist, aber ich möchte erst mal meinen Fehler bei dieser verstehen um im nächsten Schritt döse effizienter zu machen.
Mit freundlichen Grüßen
-
Wie kann man falsch kopieren
Dann sag mal, bei welchem Input welcher Output kommt.
-
Ich hatte den Code kopiert gehabt als ich noch Sachen ausprobierte und da habe ich wohl vergessen gehabt, das Zeichen zu ändern. Aber egal
Jetzt sieht die Zeile so aus
if (48 <= kette[0] >= 65 || kette[1] >= 65 || kette[2]>= 65 || kette[3]>= 65 || kette[4]>= 65 || kette[5]>= 65 || kette[6]>= 65 || kette[7]>= 65 || kette[8]>= 65 || kette[9]>= 65 || kette[10]>= 65 || kette[11]>= 65 ){ cout << "Bitte geben Sie nur Zahlen ein"<<endl; cin.get();
Wenn ich jetzt eine 12 eingebe und Enter drücke, schreibt es dass es eine Zahl wäre. Drücke ich dagegen nochmal Enter kommt die 12.
Wenn ich fünfstellige Zahlen eingebe, erkennt es diese als Zahlen. Alle drunter als Nichtzahlen.
Insgesamt wenn ich fünfstellige Zeichen eingebe funktioniert die Ausgabe erst richtig.
Mit freundlichen Grüßen
-
Dein Test
character >= 65
überprüft nicht, obcharacter
eine Ziffer ist. Wenn wir mal von ASCII ausgehen, haben Zeichen wie das Ausrufezeichen, runde Klammern, Kleiner- und Größerzeichen, Plus, Minus, Mal und Geteilt alle Werte kleiner als 65.Daher: teste, ob
character
im gewünschten Bereich liegt, d.h.if (character >= '0' && character <= '9') { gültig; } else { ungültig; }
Wenn du die Zeichen '0' und '9' nimmst, ist es gleich viel besser lesbar als mit irgendwelchen ASCII-Codes.
Das ganze solltest du dann in eine Funktion schreiben, die du für jedes Zeichen aufrufst. Du könntest sie z.B.
isDigit
nennen.(ich gehe mal davon aus, dass du das selber machen sollst - ansonsten schau mal auf http://www.cplusplus.com/reference/cctype/)
-
Jajobe schrieb:
if (48 <= kette[0] >= 65 || ...
Das ist fatal. Dadurch wird erst dieser Ausdruck
48 <= kette[0]
ausgewertet und dann dieser
[Ergebnis] >= 65
-
if (*kette >= '0' && *kette <= '9'){ for (int i = isstart; i < len; i++) { wert = wert*10 + (kette[i]-'0'); } wert= wert*vorzeichen; cout<< wert; return 0; } else { cout << "Bitte geben Sie nur Zahlen ein"<<endl; cin.get(); }
So habe es jetzt wie wob beschrieben gemacht. Bekomme es aber nur für das erste Zeichen hin, nicht für die ganze Eingabe. Wo liegt der Fehler? Bzw habt ihr nen Stichwort wonach ich suchen könnte
-
Komisch, einige Beiträge vorher konntest du noch 5 Zeichen prüfen.
-
manni66 schrieb:
Komisch, einige Beiträge vorher konntest du noch 5 Zeichen prüfen.
Ja das war ein Beispiel. Wenn ich nur wenige (hier in dem Fall 5 Zeichen geprüft habe), hat es bei Input 12 auch Output 12 ergeben.
Dafür hat es dann die Buchstaben nach der 5 Stellen nicht mehr erkannt.
-
Jajobe schrieb:
manni66 schrieb:
Komisch, einige Beiträge vorher konntest du noch 5 Zeichen prüfen.
Ja das war ein Beispiel. Wenn ich nur wenige (hier in dem Fall 5 Zeichen geprüft habe), hat es bei Input 12 auch Output 12 ergeben.
Dafür hat es dann die Buchstaben nach der 5 Stellen nicht mehr erkannt.Jajobe schrieb:
So habe es jetzt wie wob beschrieben gemacht. Bekomme es aber nur für das erste Zeichen hin, nicht für die ganze Eingabe. Wo liegt der Fehler? Bzw habt ihr nen Stichwort wonach ich suchen könnte
?
-
Achso. Ja. Ich weiß dass es daran liegt, dass ich nur auf das "erste Arrayglied" zugreifen kann. Sprich wenn ich *kette greift es nur auf kette[0] zu. Vorher habe ich alle 11 Glieder manuell eingegeben. Aber das muss ja auch irgendwie schöner lösbar sein, dass ich auf die ganze kette zugreifen kann.
-
Schleife