Problem mit while und/oder scanf (vermutlich)



  • also, ich hoffe ich bin hier richtig. folgende aufgabenstellung:
    eine möglichkeit einfügen, um abzufragen ob auch wirklich eine zahl und nicht etwa ein buchstabe, sonderzeichen, etc eingegeben wurde.
    meine "lösung":

    printf("Bitte L%cnge Seite a eingeben: ", ä);
    	check = scanf("%lf", &a);
    	do
    	{
    		if ((a <= 0) && (check == 1))
    		{
    			printf("Seitenl%cnge muss > 0 sein. Bitte erneut eingeben.\n", ä);
    			check = scanf("%lf", &a);
    		}
    		if (check == 0)
    		{
    			printf("Nur Zahlen erlaubt. Bitte erneut eingeben.\n");
    			check = scanf("%lf", &a);
    		}
    	}
    	while ((a <= 0) || (check == 0));
    

    folgendes problem: wenn ich eine zahl <= 0 eingebe funktioniert alles noch bestens und ich werde, auch bei mehrmaliger fehl-eingabe, zum erneuten eingeben aufgefordert. sobald ich aber einen buchstaben eingebe, wird die schleife allerdings einfach unendlich oft durchlaufen und ich bekomme keine möglichkeit mehr meine eingabe zu korrigieren.
    temp zum abfangen von whitespaces habe ich schon versucht, ebenso auch fflush, beides allerdings ohne änderung im verhalten des programms.
    zusatzinfo: in der char-variable "ä" habe ich einfach nur '\x84' gespeichert, damit der buchstabe "ä" korrekt ausgegeben wird. das funktioniert auch problemlos und ist für die lösung meines problems wie auch eigentlich für die komplette aufgabenstellung unerheblich. ist nur so ne kleine spielerei die ich selbst noch eingebaut hab weil die ausgabe so einfach schöner aussieht.





  • Der Buchstabe verbleibt noch im Eingabestrom, da er nicht zu %lf passt.
    Den musst du erst entfernen.

    Das geht z.B damit: https://www.c-plusplus.net/forum/p1146014#1146014
    (das liest den Rest bis zu einem '\n')

    Bei deinem Umlaut gibt es auch andere Lösungen:

    printf("Bitte L\x84nge Seite a eingeben: ");
    oder
    #define auml "\x84"
    printf("Bitte L"auml"nge Seite a eingeben: ");
    

    oder schreibe ae. Funktioniert immer, egal welche Codierung.



  • ja, dass es am eingabespeicher liegt ist mir jetzt, während ich mittagessen kaufen war auch eingefallen. danke für die hilfe.
    bezüglich der umlaute, das habe ich deshalb so gelöst weil bei "l\x84nge" immer der compiler gemeckert hat, dass es für ein zeichen zu gross wäre oder ähnliches. da ich persönlich aber "ae" äusserst unschön finde, dachte ich mir dann ich speicher es halt einfach in eine extra angelegte char-variable und füg die dann eben ein. und da ich gern immer alles möglichst konstant halte, hab ich das dann auch gleich für alle anderen umlaute so gemacht, unabhängig davon ob \x## nun funktioniert oder nicht.



  • Nachtrag:
    da die lösung

    int c; // int c, nicht char c.
    while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
    

    scheinbar nicht in c funktioniert, sondern nur in c++ (habe statt "c" einfach mein "a" genommen, ansonsten nichts verändert. mir wurde dann a grundsätzlich immer auf den wert 10 gesetzt, egal was ich eingegeben habe.), musste ich es jetzt etwas anders lösen.
    habe es nun so hinbekommen, dass ich nach die eigentliche scanf-funktion nocheinmal eine zweite scanf-funktion geschrieben habe, die einzig und allein dazu dient, mögliche chars abzufangen. das ganze sieht dann in etwa so aus:

    // Seitenlänge einlesen
    	printf("Bitte L%cnge Seite a eingeben: ", ä);
    	check = scanf("%lf", &a);
    	scanf("%c", &temp);
    
    	// Überprüfung der Eingabe
    	do
    	{
    		if ((a <= 0) && (check == 1))
    		{
    			printf("Seitenl%cnge muss > 0 sein. Bitte erneut eingeben.\n", ä);
    			check = scanf("%lf", &a);
    			scanf("%c", &temp);
    		}
    		if (check == 0)
    		{
    			printf("Nur Zahlen erlaubt. Bitte erneut eingeben.\n");
    			check = scanf("%lf", &a);
    			scanf("%c", &temp);
    		}
    	}
    	while ((a <= 0) || (check == 0));
    

    funktioniert soweit alles recht gut und erfreulich. ich hoffe es hilft anderen, die evtl auf das gleiche problem treffen.
    ich denk mal damit kann das topic dann jetzt auch geclosed und das problem als gelöst betrachtet werden, sofern nicht noch jemand etwas dazu sagen möchte?



  • Luzilyo schrieb:

    Nachtrag:
    da die lösung

    int c; // int c, nicht char c.
    while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
    

    scheinbar nicht in c funktioniert, sondern nur in c++

    Das ist C und stammt aus der FAQ aus diesem Unterforum.
    [quote="Luzilyo"] (habe statt "c" einfach mein "a" genommen, ansonsten nichts verändert.[/code] Solange dein a ein int ist, ist das ok.

    Luzilyo schrieb:

    mir wurde dann a grundsätzlich immer auf den wert 10 gesetzt, egal was ich eingegeben habe.), musste ich es jetzt etwas anders lösen.

    Nach der Schleife ist das klar, da das die Abbruchbedingung ist. Aber was willst du mit dem Zeichen machen?

    Luzilyo schrieb:

    habe es nun so hinbekommen, dass ich nach die eigentliche scanf-funktion nocheinmal eine zweite scanf-funktion geschrieben habe, die einzig und allein dazu dient, mögliche chars abzufangen. das ganze sieht dann in etwa so aus:

    // Seitenlänge einlesen
    	printf("Bitte L%cnge Seite a eingeben: ", ä);
    	check = scanf("%lf", &a);
    	scanf("%c", &temp);
    ...
    

    Du liest nur ein Zeichen ein, also kann von chars (plural) nicht die Rede sein.
    Dieses Verhalten kannst du auch mit einem getchar bekommen.

    Luzilyo schrieb:

    funktioniert soweit alles recht gut und erfreulich. ich hoffe es hilft anderen, die evtl auf das gleiche problem treffen.
    ich denk mal damit kann das topic dann jetzt auch geclosed und das problem als gelöst betrachtet werden, sofern nicht noch jemand etwas dazu sagen möchte?

    Wenn du nur ein zusätzliches Zeichen als fehlerhaft ansiehst, ist das OK.
    Was ist aber, wenn die Katze mal wieder auf der Tastatur steht?



  • Luzilyo schrieb:

    funktioniert soweit alles recht gut und erfreulich. ich hoffe es hilft anderen, die evtl auf das gleiche problem treffen.

    Frechheit, deinen Schrott hier anzupreisen.
    Ob etwas funktioniert oder nicht kannst du als Anfänger überhaupt nicht beurteilen.
    Deine Stümperversuche unter Ignorierung der hier gegebenen Hinweise sind einfach nur Müll und keinesfalls eine Empfehlung als Problemlösung wert.



  • DirkB schrieb:

    Luzilyo schrieb:

    Nachtrag:
    da die lösung

    int c; // int c, nicht char c.
    while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
    

    scheinbar nicht in c funktioniert, sondern nur in c++

    Das ist C und stammt aus der FAQ aus diesem Unterforum.

    Luzilyo schrieb:

    (habe statt "c" einfach mein "a" genommen, ansonsten nichts verändert.

    Solange dein a ein int ist, ist das ok.

    ah ok. ja, es lag wohl am int.

    DirkB schrieb:

    Luzilyo schrieb:

    mir wurde dann a grundsätzlich immer auf den wert 10 gesetzt, egal was ich eingegeben habe.), musste ich es jetzt etwas anders lösen.

    Nach der Schleife ist das klar, da das die Abbruchbedingung ist. Aber was willst du mit dem Zeichen machen?

    im grunde geht es darum für ein rechtwinkliges dreieck seitenlänge a und winkel alpha einzugeben und dann eben die restlichen seiten und winkel berechnen zu lassen. das funktioniert soweit auch. nur als ganz letzte aufgabe steht eben noch "benutzer gibt keine gleitpunktzahl ein. hinweis: beachten sie den rückgabewert von scanf()"

    DirkB schrieb:

    Luzilyo schrieb:

    habe es nun so hinbekommen, dass ich nach die eigentliche scanf-funktion nocheinmal eine zweite scanf-funktion geschrieben habe, die einzig und allein dazu dient, mögliche chars abzufangen. das ganze sieht dann in etwa so aus:

    // Seitenlänge einlesen
    	printf("Bitte L%cnge Seite a eingeben: ", ä);
    	check = scanf("%lf", &a);
    	scanf("%c", &temp);
    ...
    

    Du liest nur ein Zeichen ein, also kann von chars (plural) nicht die Rede sein.
    Dieses Verhalten kannst du auch mit einem getchar bekommen.

    ja, getchar hab ich auch schon des öfteren gelesen, aber wir sollen, zumindest bis jetzt, ausschliesslich mit scanf arbeiten.

    DirkB schrieb:

    Luzilyo schrieb:

    funktioniert soweit alles recht gut und erfreulich. ich hoffe es hilft anderen, die evtl auf das gleiche problem treffen.
    ich denk mal damit kann das topic dann jetzt auch geclosed und das problem als gelöst betrachtet werden, sofern nicht noch jemand etwas dazu sagen möchte?

    Wenn du nur ein zusätzliches Zeichen als fehlerhaft ansiehst, ist das OK.
    Was ist aber, wenn die Katze mal wieder auf der Tastatur steht?

    das stimmt, wie das mit mehreren zeichen ist habe ich so noch überhaupt nicht bedacht. ist zwar für die aufgabenstellung wohl auch nicht wirklich notwendig aber ich werd wohl trotzdem versuchen es dahingehend zu erweitern. danke für den tipp.

    Wutz schrieb:

    Luzilyo schrieb:

    funktioniert soweit alles recht gut und erfreulich. ich hoffe es hilft anderen, die evtl auf das gleiche problem treffen.

    Frechheit, deinen Schrott hier anzupreisen.
    Ob etwas funktioniert oder nicht kannst du als Anfänger überhaupt nicht beurteilen.
    Deine Stümperversuche unter Ignorierung der hier gegebenen Hinweise sind einfach nur Müll und keinesfalls eine Empfehlung als Problemlösung wert.

    danke für den freundlichen hinweis. ich habe ihn zur kenntnis genommen.



  • Luzilyo schrieb:

    das stimmt, wie das mit mehreren zeichen ist habe ich so noch überhaupt nicht bedacht. ist zwar für die aufgabenstellung wohl auch nicht wirklich notwendig aber ich werd wohl trotzdem versuchen es dahingehend zu erweitern. danke für den tipp.

    Genau dafür ist die while-Schleife aus der FAQ da.


Anmelden zum Antworten