do while schleife



  • 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).



  • @DirkB: Der "zentrale Ort zum nachschauen" klingt, als wäre das ein Vorteil. Ist es aber nicht.



  • Naivling.
    Es gibt noch eine Welt außerhalb deines Blickfeldes.



  • Wie bitte?



  • So nun habe ich noch hoffentlich die letzte Frage für ein paar Tage 😃 Folgendes:

    do {
    					fflush(stdin);
    					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);
    

    Die Überprüfung im while hat einfach nie geklappt, es wurde zwar ausgegeben dass der Key zu kurz ist(oder zu lang), aber trotzdem ging er nicht wieder zurück zum beginn der schleife.
    Nun habe ich die && durch || ersetzt und oh wunder es klappt. Was mich aber stutzig macht ist dass die Überprüfung der 2. do-while schleife funktioniert hat mit den && Zeichen:

    }while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N');
    

    Kann mir einder den Unterschied erklären. Ich peil das grad echt nicht 😕

    Falls notwendig der vollständige Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char keyUsage ;
        char key[] = "testkey";
    	char laenge ;
    
        do {
            printf("Wollen Sie eine Verschluesselung benutzen(Ja/Nein)? \n");   /* soll das WLAN Netzwerk verschlüsselt sein? */
            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 {
    					fflush(stdin);
    					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;
    
                case 'n': case 'N':
    				fflush(stdin);
    				printf("Achtung! - Sie verwenden keine Verschluesselung, dies ist sehr gefaehrlich!!! \n "); /* warnt den User dass die gewählte Option gefährlich ist */
                    break;
    
                default	:
    				fflush(stdin);
    				printf("Error - Haben sie Ja oder Nein eingegeben? \n");    /* sollte der User nicht Ja/Nein eintippen gelangt er hierhin */
                    break;
    		}
    	}while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N'); /* führt die obengenannten Aufgaben durch bis eine der Bedingungen erfüllt ist */
    

    In meinen Augen müsste bei der 2. do-while Schleife in die Abfrage ebenfalls ein logisches oder (||)



  • do-while wird solange durchlaufen, solange die Bedingung wahr ist.

    while (laenge > 16 && laenge < 8);
    Finde mal eine Zahl die größer 16 und kleiner 8 ist.

    while (laenge > 16 || laenge < 8);
    Eine Zahl die größer 16 oder kleiner 8 ist.
    Gibt es reichlich.

    while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N');
    Es gibt einige Zeichen die ungleich 'j' und ungleich 'J' und ... 'N' sind,
    z.B. 'A'



  • DirkB schrieb:

    do-while wird solange durchlaufen, solange die Bedingung wahr ist.

    while (laenge > 16 && laenge < 8);
    Finde mal eine Zahl die größer 16 und kleiner 8 ist.

    while (laenge > 16 || laenge < 8);
    Eine Zahl die größer 16 oder kleiner 8 ist.
    Gibt es reichlich.

    while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N');
    Es gibt einige Zeichen die ungleich 'j' und ungleich 'J' und ... 'N' sind,
    z.B. 'A'

    Ist mir ja alles klar aber bei der 2. Abfrage genügt für mich ja auch bereits eine erfüllte Abbruchbedingung, da so oder so nur eine zeigleich erfüllt sein kann. Folglich müsste dass doch auch mit einem oder funktionieren?



  • mestaaz schrieb:

    In meinen Augen müsste bei der 2. do-while Schleife in die Abfrage ebenfalls ein logisches oder (||)

    Dann musst du auch die != in == ändern und die ganze Bedingung negieren mit !



  • DirkB schrieb:

    mestaaz schrieb:

    In meinen Augen müsste bei der 2. do-while Schleife in die Abfrage ebenfalls ein logisches oder (||)

    Dann musst du auch die != in == ändern und die ganze Bedingung negieren mit !

    Was meinst du mit negieren?


Anmelden zum Antworten