Student mit Anfängerproblemen / Hilfe bei Aufgaben



  • Naja, hab schon öfter gelesen, daß das nasal deamon ist.
    Aber bis heute hat's halt immer geholfen, und ich weiß nix andres.

    Müßte man da zu Fuß den Puffer leeren?



  • Versuch mal:

    #include <stdio.h>
    
    int main () {
    
        char X, E, L, S, A, B;
        char[80] eingabe;        // <---- neu
    
        printf("********** Telefonverzeichnis **********\n\n");
        printf("E = Neuen Eintrag einfuegen\n");
        printf("L = Eintrag loeschen\n");
        printf("S = Telefonnummer suchen\n");
        printf("A = Alle Eintraege anzeigen\n");
        printf("B = Programm beenden\n\n\n");
    
        printf("Bitte waehlen Sie\n");
        marke:
        scanf("%s", &eingabe);     // <----- geändert
        X = eingabe[0];            // <----- neu
    
           switch (X) {
    
            case ('E'): printf("Ihre Wahl: Neuen Eintrag einfuegen\n");
                break;
            case ('L'): printf("Ihre Wahl: Eintrag loeschen\n");
                break;
            case ('S'): printf("Ihre Wahl: Telefonnummer suchen\n");
                break;
            case ('A'): printf("Ihre Wahl: Alle Eintraege anzeigen\n");
                break;
            case ('B'): printf("Ihre Wahl: Programm beenden\n");
                break;
            default: {printf("Eingabe nicht korrekt. Ihre Wahl:\n"); goto marke;}
                break;
    
        }
        printf("\n");
        return 0;
    }
    


  • flamer schrieb:

    Aber bis heute hat's halt immer geholfen, und ich weiß nix andres.

    Es führt zu undefiniertem Verhalten, wie du sicher gelesen hast. Dass es sich wie erwartet verhalten hat ist entweder implementationsbedingt oder Zufall. Man sollte sich nicht drauf verlassen.

    Formatiertes *direktes* einlesen ist eigentlich nie sinnvoll, ganze Zeilen sind immer die bessere Alternative, aus denen man dann immer noch mit sscanf extrahieren kann.

    #define LINELEN 256
    char buf[LINELEN];
    /* ... */
    fgets(buf, LINELEN, stdin);
    sscanf(buf, "%c", &c);
    

    Das sollte dein fflush(stdin); Problem sauberer lösen. Nicht vergessen fgets auf NULL als return-Wert zu prüfen sowie den return-Wert von sscanf (in diesem Fall 1).
    Und eine do-while-Schleife sind zudem auch schöner aus eine goto-Lösung. Probier's aus. Und lass dir was sagen von jemandem, der auch mal was weiß 🙄 der sich im Gegensatz zu dir auch um Probleme kümmert und sich nicht um Arbeit mit der Ausrede "hatten" wir noch nicht gedrückt" drückt - hast du dich so auch durch deine Schulzeit geschlagen?



  • Öhm wann hab ich gesagt dass ich Informatik studier und warum der Unterton? Musste dick auftragen im Inet :P? Bis jetzt kam von allen außer dir was Hilfreiches.

    [quote=Belli]Versuch mal: [/quote]

    Edit: Ich tests nochmal 😉



  • Belli schrieb:

    Versuch mal:

    #include <stdio.h>
    
    int main () {
    
        char X, E, L, S, A, B;
        char[80] eingabe;        // <---- neu
    }
    

    Das muß natürlich:

    char eingabe[80];

    heißen!



  • ray schrieb:

    Öhm wann hab ich gesagt dass ich Informatik studier und warum der Unterton? Musste dick auftragen im Inet :P? Bis jetzt kam von allen außer dir was hilfreiches.

    Pardon, mein Fehler, ich meinte natürlich dein Praktikum.
    Und nein, ich muss nicht dick auftragen. Und wenn du eine saubere Lösung als nicht hilfreich erachtest, ist das dein Problem. Nur weil ich dir keinen ganzen Source gebe...tze... 😉



  • Jetzt kommt doch der gleiche Fehler nochmal:
    http://i38.tinypic.com/6pnk2h.jpg
    http://i38.tinypic.com/2b7b6x.jpg



  • Xantus schrieb:

    Pardon, mein Fehler, ich meinte natürlich dein Praktikum.
    Und nein, ich muss nicht dick auftragen. Und wenn du eine saubere Lösung als nicht hilfreich erachtest, ist das dein Problem. Nur weil ich dir keinen ganzen Source gebe...tze... 😉

    Joa dann denkste erstmal nach bevor du postest und liest wie du selbst in deiner sig geschrieben hast ge? Kann ja nicht jeder der krasse Coder sein wie du, vorallem würd ich ja sonst nicht hier posten.

    Ich hab nicht nach ner sauberen Lösung sondern nach ner Hilfe auf meinem Wissensstand gefragt - deine "saubere" Lösung ist nicht hilfreich was wohl offensichtlich ist. Aber glücklicherweise geben sich sonst alle bisschen mehr Mühe und helfen - ohne dick aufzutragen und sich großzutun ;).



  • Ganz wilde Spekulation, aber ich glaube du benutzt die Variable X ohne sie vorher zu initialisieren.



  • Das kann nicht sein!!!

    ... joa das ist mir auch aufgefallen. Was aber Fakt ist, ist dass ich keine Ahnung hab, wie ichs in Griff bekomm.

    Das einzige Problem ist, dass mir der default Befehl bei falscher Eingabe zweimal Ausgegeben wird - sonst nichts. Ich kann mir wirklich nicht vorstellen, dass ich um das zu fixen mehr lernen muss als im Skript steht, wirklich nicht.



  • ray schrieb:

    Das kann nicht sein!!!

    ... joa das ist mir auch aufgefallen. Was aber Fakt ist, ist dass ich keine Ahnung hab, wie ichs in Griff bekomm.

    Das einzige Problem ist, dass mir der default Befehl bei falscher Eingabe zweimal Ausgegeben wird - sonst nichts. Ich kann mir wirklich nicht vorstellen, dass ich um das zu fixen mehr lernen muss als im Skript steht, wirklich nicht.

    Ach, es gibt mehr unfähige Lehrer und Praktikumsleiter, als du dir vorstellen kannst.
    Machs mit fgets in Verbindung mit sscanf - Code siehe oben 😉 und die Fehlerausgabe sollte nur noch einmal erscheinen.

    Aber hier nochmal:

    char buf[80];
    fgets(buf, 80, stdin);
    sscanf(buf, "%c", &X);
    

    sscanf gehört zur selben Familie wie scanf, nur dass es eben nicht von stdin liest, sondern aus einem string.



  • Tim schrieb:

    Ganz wilde Spekulation, aber ich glaube du benutzt die Variable X ohne sie vorher zu initialisieren.

    er macht scanf ("%c", ... , dann ist nix zufälliges mehr drin.
    und Bellis code setzt sie auf eingabe[0] .
    🙂



  • ~fricky schrieb:

    er macht scanf ("%c", ... , dann ist nix zufälliges mehr drin.
    und Bellis code setzt sie auf eingabe[0] .
    🙂

    Das war das Problem, ich hab eingabe anstelle von x in scanf stehn gehabt. Habs gefixed, jedoch mit dem selben Ergebnis wie zu Beginn, doppelte default Ausgabe.

    Xantus schrieb:

    ...

    Dann werd ichs mal doch so machen - auch wenn ich nicht so weiß was ich da mach 😃 - bin mal gespannt was der Dozent dazu und zu der Aufgabe ansich sagt, wenn ich ihn frag wie denn seine Lösung lautet.



  • du könntest auch folgendes tun:
    1. nimm dein original-progrämmchen (das vom ersten beitrag)
    2. tausch deine 'scanf'-zeile gegen diese zeile:

    do scanf ("%c", &X); while (X == '\n');
    

    3. ausprobieren...
    🙂



  • Yeah ne do while schleife und ich hab mir die ganze Zeit überlegt wie ich sie einbaun könnt! Danke dir, ich machs mal.

    Und siehe da, es funzt, ein riesen Dank an dich.



  • [quote="ray"]

    ~fricky schrieb:

    er macht scanf ("%c", ... , dann ist nix zufälliges mehr drin.
    und Bellis code setzt sie auf eingabe[0] .
    🙂

    Das war das Problem, ich hab eingabe anstelle von x in scanf stehn gehabt. Habs gefixed, jedoch mit dem selben Ergebnis wie zu Beginn, doppelte default Ausgabe.

    Dann hast Du sicher nicht den Parameter von %c auf %s geändert.

    Frickys Lösung funktioniert, solange Du nicht mehr als eine Stelle eingibst, zB dürfte die Eingabe von XB eine falsche Reaktion auslösen.
    Um das ganz sicher zu machen, müsstest Du einmal nach X einlesen, und dann in einer Schleife bis '\n' in einen Dummy-char.



  • XB soll ja im Prinzip eine falsche Eingabe sein. Von daher bin ich damit schon recht zufrieden, dennoch vielen Dank für alle Lösungen, ich werd mal weiterhin an ner Kopie bisschen dran rumspielen, um die Sachen zu verwirklichen die du und andere genannt haben.

    Dickes Danke nochmal, werd bestimmt mal wieder posten (hätt im Prinzip ne neue Aufgabe - aber will auch nich nerven und fang nochmal an des Skript zunächst zu studieren 😉 ).



  • Wenn ich mich nicht irre, wird Frickys Lösung aber nicht als falsche Eingabe erkannt, sondern eine falsche Reaktion auslösen, nämlich die Reaktion auf eine Eingabe B.
    Wenn Du das nicht willst, aber die Eingabe trotzdem als falsch behandeln willst, wird es aufwendiger.
    Du müsstest dann doch entweder zu meinem Vorschlag zurückkehren, oder einem anderen, der eine ganze Zeile einliest, die Länge der Eingabe prüfen (ungleich 1 --> falsche Eingabe), und erst, wenn Du verifiziert hast, daß nur ein Zeichen eingegeben wurde, weiter wie gehabt.



  • Kauderwelsch - nochmal deutlich:
    Eingabe von XB wird bei Frickys Lösung eine falsche Reaktion auslösen, probier es einfach aus.



  • Stimmt habs grad getestet.


Anmelden zum Antworten