do while schleife



  • Hallo Zusammen

    Ich steh wohl grad ziemlich auf dem Schlauch ­čśâ

    Mir will einfach nicht in den Kopf was daran falsch ist:

    do {
            printf("Wollen Sie eine Verschluesselung benutzen(Ja/Nein)?");
            scanf("%s", &keyUsage);
            if (keyUsage = "Ja") {
    			int keyUsageing = 1;
            }else{
                if (keyUsageing = "Nein") {
    				int KeyUsageing = 0;
    			}else{
    				int keyUsageing = 2;
    			}
    		}
            switch(keyUsageing) {
    			case 1  :		printf("OK - Eine Verschluesselung wird verwendet");
    							break;
                case 0  :		printf("Achtung! - Sie verwenden keine Verschluesselung, dies ist sehr gef├Ąhrlich!!!");
                                break;
    			case 2	:		printf("Ihre Eingabe war falsch - Nur Ja oder Nein ist erlaubt!!!");
    
                default	:		printf("Error - Unbekannter Fehler!");
        }while (keyUsage != "Ja" && keyUsage != "Nein");
    

    Beim kompilieren kriege ich immer die gleiche Fehlermeldung:

    "Error: expected "while" at end of input"

    Nur da steht ja auch ein while ­čśĽ

    Mfg
    mestaaz


  • Mod

    Z├Ąhl doch mal die Klammern. Oder r├╝ck vern├╝nftig ein. Oder am besten erst vern├╝nftig einr├╝cken, dann geht das Klammerz├Ąhlen ganz einfach. Dann findest du die L├Âsung von alleine.



  • Soweit ich deinen Code mal ├╝berflogen hab fehlt das } f├╝r switch.



  • Au├čerdem, wenn's auch mit dem Fehler nix zu tun hat, hast du im zweiten if-Statement die falsche Variable benutzt.



  • Das soll doch C Quelltext sein?

    Irgendwie hab ich Probleme mit den Zeilen: 3, 4, 7 und 21.
    Nach Zeile 18 vermisse ich etwas.
    Der Compiler wird sich vielleicht wegen der aufgez├Ąhlten Zeilen nicht beschweren.

    Ich hoffe mal das ich noch keine Fata Morgana sehe ­čśĽ



  • Zeile 8 case-sensitiv ­čśĽ



  • Die Klammern { } kennzeichnen Bl├Âcke im Programmcode. ├ľffnende und schliessende Klammern sollten der besseren Lesbarkeit halber und auch um solche Fehler zu vermeiden untereinander an derselben Textstelle stehen. Der Bereich zwischen den Klammern wird sinnvoll einger├╝ckt. Dann erkennt man selbst, was m├Âglicherweise falsch ist und weiss was der Compiler gemeint hat.

    Gew├Âhne dir das bitte an. Es erspart dir weitere solche Fragen und uns das Nachdenken! ­čÖé



  • berniebutt schrieb:

    Die Klammern { } kennzeichnen Bl├Âcke im Programmcode. ├ľffnende und schliessende Klammern sollten der besseren Lesbarkeit halber und auch um solche Fehler zu vermeiden untereinander an derselben Textstelle stehen. Der Bereich zwischen den Klammern wird sinnvoll einger├╝ckt. Dann erkennt man selbst, was m├Âglicherweise falsch ist und weiss was der Compiler gemeint hat.

    Gew├Âhne dir das bitte an. Es erspart dir weitere solche Fragen und uns das Nachdenken! ­čÖé

    Nach dem Mittagessen war mir das ganze sofort klar ­čĹŹ

    Der Quelltext sieht nun auch ganz anders aus:

    do {
            printf("Wollen Sie eine Verschluesselung benutzen(Ja/Nein)? \n");
            scanf("%c", &keyUsage);
    
            switch(keyUsage) {
                case 'j':
    				printf("OK - Eine Verschluesselung wird verwendet \n");
                    break;
                case 'J':
    				printf("OK - Eine Verschluesselung wird verwendet \n");
    				break;
    
                case 'n':
    				printf("Achtung! - Sie verwenden keine Verschluesselung, dies ist sehr gefaehrlich!!! \n ");
                    break;
    
                case 'N':
                    printf("Achtung! - Sie verwenden keine Verschluesselung, dies ist sehr gefaehrlich!!! \n ");
                    break;
    
                default	:	printf("Error - Unbekannter Fehler! \n");
                    break;
    		}
    	}while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N');
    	return 0;
    

    Was mir aber noch total unklar ist:

    Warum wird denn bittesch├Ân beim ausf├╝hren das printf in default doppelt ausgegeben und die Abfrage ob eine Verschl├╝sselung benutz werden soll gleich auch(ohne dass nach der 1. Ausgabe eine Eingabe gemacht werden kann)?

    Bsp:

    (Ausgabe)Wollen Sie eine Verschluesselung benutzen? (Ja/Nein)
    (Eingabe) aaaa
    (Ausgabe)Error - Unbekannter Fehler
    (Ausgabe)Wollen Sie eine Verschluesselung benutzen? (Ja/Nein)

    Bis hierher stimmt ja alles - doch nun passiert (zumindest nach meinem Verst├Ąndnis) etwas komisches, es kann keine Eingabe get├Ątigt werden. Es wird direkt die folgende Zeile ausgegeben:
    (Ausgabe)Error - Unbekannter Fehler
    (Ausgabe) Wollen Sie eine Verschluesselung benutzen(Ja/Nein)

    UND erst nun kann wieder eine Eingabe gemacht werden.



  • Ich vermute mal du arbeitest da unter Windows.

    Ich w├╝rde mal ein fflush(stdout) nach printf() einf├╝gen.



  • DaRe schrieb:

    Ich vermute mal du arbeitest da unter Windows.

    Ich w├╝rde mal ein fflush(stdout) nach printf() einf├╝gen.

    Vervielfacht die Error Ausgabe nur noch...

    Edit: Nun klappt das ganze, via fflush(stdin); den Eingabepuffer in jedem case leeren und gut ist. Danke nochmal an alle!

    Mfg

    mestaaz


  • Mod

    Dein scanf liest brav ein Zeichen nach dem anderen ein, wenn du mehrere Zeichen eingibst, dann macht es das eben mehrmals in der Schleife. Wenn du stattdessen immer nur eine Ausgabe pro Zeile (d.h. pro dr├╝cken der Enter-Taste) auswerten m├Âchtest, dann lies ganze Zeilen ein und Werte eben nur das erste Zeichen einer Zeile aus.



  • (Ausgabe)Wollen Sie eine Verschluesselung benutzen? (Ja/Nein)
    (Eingabe) aaaa
    (Ausgabe)Error - Unbekannter Fehler
    (Ausgabe)Wollen Sie eine Verschluesselung benutzen? (Ja/Nein)

    Bis hierher stimmt ja alles - doch nun passiert (zumindest nach meinem Verst├Ąndnis) etwas komisches, es kann keine Eingabe get├Ątigt werden. Es wird direkt die folgende Zeile ausgegeben:
    (Ausgabe)Error - Unbekannter Fehler
    (Ausgabe) Wollen Sie eine Verschluesselung benutzen(Ja/Nein)

    UND erst nun kann wieder eine Eingabe gemacht werden.

    4 mal 'a' reichen um genau zwei scanf zu "bedienen"? Wie kommt das denn?



  • Hier mal ein Link:
    http://www.c-plusplus.net/forum/289216

    das zu fflush(stdin);
    Sollte nur genutzt werden, wenn in der Doku des genutzten Compilers darauf hingewiesen wurde das es funktioniert. Laut C-Standard funktioniert das nicht zuverl├Ąssig. Dies, da einige keine Links lesen.



  • Und noch zwei kleine weitere Hinweise:

    - Mache dich mit den Unterschieden von while- und do-while-Schleifen vertraut.
    - Verwende statt so komplizierter zusammengesetzter Abbruchkriterien besser eine lokale Variable (0/1 oder false/true), die du ├╝berpf├╝fen kannst.

    Nun leg dich wieder hin, esse zu Abend, schlafe gut, und morgen machst du weiter! ­čśë



  • DaRe schrieb:

    4 mal 'a' reichen um genau zwei scanf zu "bedienen"? Wie kommt das denn?

    Hoppla mein Fehler. Ich begrenze mich bei der Abfrage nun auf das j/n, da dies ja auch schon reicht um eine eindeutige Aussage zu treffen.

    f.-th. schrieb:

    Hier mal ein Link:
    http://www.c-plusplus.net/forum/289216

    das zu fflush(stdin);
    Sollte nur genutzt werden, wenn in der Doku des genutzten Compilers darauf hingewiesen wurde das es funktioniert. Laut C-Standard funktioniert das nicht zuverl├Ąssig. Dies, da einige keine Links lesen.

    Was f├╝r eine L├Âsung schl├Ągst du denn vor?

    berniebutt schrieb:

    - Mache dich mit den Unterschieden von while- und do-while-Schleifen vertraut.
    - Verwende statt so komplizierter zusammengesetzter Abbruchkriterien besser eine lokale Variable (0/1 oder false/true), die du ├╝berpf├╝fen kannst.

    Die Unterschiede zwischen do und do-while Schleifen sind mir bekannt und genau die Eigenschaft der do-while Schleife dass die Schleife erst ausgef├╝hrt wird und erst dann eine Pr├╝fung der Bedingungen stattfindet ist hier ja gew├╝nscht.

    Die ├Ęberlegung mit boolean habe ich auch get├Ątigt, mir erschien die do-while Schleife jedoch als sauberere L├Âsung. Warum schl├Ągst du denn in diesem falsch explizit eine lokale Variable vor?

    Vielen dank allen die mir geholfen haben. Nun habe ich aber noch ein kleines Problem:

    do {
            printf("Wollen Sie eine Verschluesselung benutzen(Ja/Nein)? \n");   
            scanf("%c", &keyUsage);
    
            switch(keyUsage) {  /* ├╝berpr├╝ft die Eingabe des Users: j/J = Ja n/N = Nein betreffend Verschl├╝sselung */
                case 'j': case 'J' :
    				fflush(stdin);  /* leert den Eingabepuffer */
    				printf("OK - Eine Verschluesselung wird verwendet \n");
    				do {
    					printf("Bitte Key fuer die Verschluesselung eingeben(mindestens 8 Zeichen - maximal 16 Zeichen: \n");    /* speicher den vom User eingegebenen Key in einen String Namens key */
    					scanf("%s",  &key);
    					size_t laenge;			/* speichert in die Variable laenge die L├Ąnge(Anzahl Zeichen) des Strings "key" */
    					laenge = strlen(key);
    					if ( laenge < 8 ) {
    						printf("Ihr Key ist zu kurz, bitte geben sie ihn erneut ein \n");
    					}else{
    						if (laenge > 16) {
    							printf("Ihr Key ist zu lang, bitte geben Sie ihn erneut ein \n");
    						}else{
    							printf("Ihr Key ist in Ordnung \n");
    						}
    					}
    				}while (laenge < 16 && laenge > 8);
    					break;
    

    Dieser Code erzeugt die Fehlermeldung: error: 'laenge' undeclared (first use in this function).

    Die Fehlermeldung verstehe ich ja, nur ist mir nicht klar warum diese auftritt. Die Variable "laenge" ist ja definiert und bei den vorherigen ben├╝tzung kurz oberhalb motzt der Compiler ja auch nicht rum....

    MfG
    mestaaz



  • Die Zeilennummer in der der Fehler auftritt w├Ąre nett gewesen.

    Du definierst laenge innerhalbe der {} von do-while

    In Zeile 23 benutzt du es aber au├čerhalb dieser Klammern.



  • DirkB schrieb:

    Die Zeilennummer in der der Fehler auftritt w├Ąre nett gewesen.

    Du definierst laenge innerhalbe der {} von do-while

    In Zeile 23 benutzt du es aber au├čerhalb dieser Klammern.

    Gibt es eine M├Âglichkeit aus dieser lokalen Variable(oder?) eine zu machen die auch ausserhalb der do while Schleife g├╝ltig ist?



  • Au├čerhalb des Scope der do-while-Schleife definieren.
    Also vor dem do{.

    In C89 w├Ąre das Problem nicht aufgetreten, da alle Variablen am Beginn der Funktion definiert werden m├╝ssen.
    Da hat man auch einen zentralen Ort zum nachschauen.



  • DirkB schrieb:

    Au├čerhalb des Scope der do-while-Schleife definieren.
    Also vor dem do{.

    In C89 w├Ąre das Problem nicht aufgetreten, da alle Variablen am Beginn der Funktion definiert werden m├╝ssen.
    Da hat man auch einen zentralen Ort zum nachschauen.

    Also gleich zu beginn definieren und den Wert dann erst in der Schleife zuweisen richtig?



  • mestaaz schrieb:

    Also gleich zu beginn definieren und den Wert dann erst in der Schleife zuweisen richtig?

    Ja, oder halt direkt vor dem do {.

    Den Wert weist du in allen F├Ąllen erst in der Schleife zu (Zeile 13).


Log in to reply