Cin.Getline nur Zahlen erlauben



  • 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, ob character 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



  • Schleife ist scheinbar nicht gewollt 🙄 😃

    Jajobe-Neu schrieb:

    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.



  • Mache es jetzt doch mit Schleife. Professor hat mir dazu geraten.

    while (g<=11){
    
      g++;
    
                    	if (kette[g] >= '-' && kette[g] <= '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();
    
                }
    
    }
    }
    

    Aber es funktioniert noch immer irgendwie nicht. Wird irgendwie noch immer nur die erste Stelle geprüft.



  • Boy, rück erst mal den Code gscheit' ein..

    Weißt du was ASCII ist? Alles zw. - und 0 wäre auch . / aber kein +.

    Und überleg noch mal, wie der Ablauf des Programms sein soll. So wahrscheinlich nicht.



  • Ja. Sorry. Versuche das irgendwie gerade durchzuboxen.
    Ja ich weiß schon was Asci Werte sind. Aber + ist grundsätzlich egal. Deswegen habe ich das - min einbezogen. Es ist eher unwahrscheinlich dass der Benutzer .oder / eingibt (so Bedingung von meinem Prof).



  • Und "3--3-2-1" ist eine gültige Zahl?

    Programmieren ist immer auch über Genauigkeit, sowas wie "wird wahrscheinlich nicht passieren" ist der Anfang vom Ende und Ursache vieler Sicherheitslücken. Was hindert dich zu testen, ob ein Wert zwischen (jeweils inkl.) '0' und '9' liegt ODER '-' ist? Dann ist es gleich richtig.

    Und dann überleg mal weiter: das Minus-Zeichen darf nur am Anfang stehen. Alles andere müssen Ziffern sein (sofern wir jetzt keine 1000er-Trennzeichen haben). Also musst du ggf. das erste Zeichen anders als den Rest behandeln.

    Das ist keine Aufgabe, an der man sich wochenlang aufhalten sollte, auch als Anfänger nicht.


Anmelden zum Antworten