Seltsamer Fehler?



  • Hallo, ich hab ein ganz banales Problem.

    int scanf_test()
    {
        unsigned int d1;
        char c1, c2;
    
        puts("Geben Sie zuerst ein Zeichen, dann eine vorzeichenlose Dezimalzahl");
        puts("und zuletzt wieder ein Zeichen ein.\n");
    
        scanf("%c %u %c", &c1, &d1, &c2);
    
        printf("\n%c\t %u\t %c", c1, d1, c2);
    
        return 0;
    }
    

    Nun mal zum Problem.
    Wenn ich das ausführe, endet scanf() nach Eingabe der Ziffer d1 und printf() gibt mir dann das erste Zeichen und die Ziffer aus.

    Kann mir jemand erläutern was ich falsch mache?
    Der Code stammt in leicht geänderter Form aus dem Buch "C in 21 Tagen". Die Lösung dort lautet scanf("%c %ud %c", c1, d1, c2); was aber wegen der Fehlenden Adress-Operatoren unmöglich funktionieren kann, meine ich.

    Ich programmiere unter Ubuntu 8.10 mit Code::Blocks und dem GCC 4.3.
    Kann da irgendwas "kaputt" sein?

    MfG



  • Hi,
    lies mal
    http://win-tux.de/c_005_001.htm#RxxobKap005001040025E21F04018C
    vllt. findest du ja eine Lösung für Linux...

    MfG Jonas 🙂



  • Ja, danke soweit erstmal.

    Das Buch scheint ganz brauchbar. Ich werd es mir mal antun.

    Greetz spence



  • Das Buch sollte jedoch unter Vorbehalt gelesen werden,
    d.h. nicht gleich alles glauben^^
    Schön wenn ich dir helfen konnte 😃

    MfG Jonas 🙂



  • Spence schrieb:

    Kann mir jemand erläutern was ich falsch mache?
    Der Code stammt in leicht geänderter Form aus dem Buch "C in 21 Tagen". Die Lösung dort lautet scanf("%c %ud %c", c1, d1, c2); was aber wegen der Fehlenden Adress-Operatoren unmöglich funktionieren kann, meine ich.

    Primär sieht das OK, aus, was Du machst und Du hast völlig recht, ohne Referenzübergabe geht das gar nicht.
    Was GANZ GENAU hast Du eingegeben? Mit flushen zu experimentieren ist übrigens keine schlechte Idee.

    Zwei Tips/Bitten noch:
    "Seltsamer Fehler" ist kein wirklich aussagekräftiger Titel und für Source gibt es die C/C++- Tags. Für Deine Eingabe wären die "Code"- Tags z.B. ideal. 😉



  • So langsam macht sich die Depression breit.

    Ich hab die 3. Möglichkeit, wie im Buch beschrieben, ausprobiert, da fflush() scheinbar nicht funktioniert.
    Und da ich noch ungeklärte Probleme mit der Umwandlung des String-Inhalts zu Integer habe (Genauer Grund ist hier Unwissenheit), nutze ich dafür wie gehabt scanf().

    Nun siehts so aus:

    int scanf_test()
    {
        unsigned int d1;
        char c1, c2, buffer[2];
    
        puts("Geben Sie zuerst ein Zeichen, dann eine vorzeichenlose Dezimalzahl");
        puts("und zuletzt wieder ein Zeichen ein.\n");
    
        fgets(buffer, 2, stdin);
        sscanf(buffer, "%c", &c1);
    
        scanf("%u", &d1);
    
        fgets(buffer, 2, stdin);
        sscanf(buffer, "%c", &c2);
    
        printf("\n%c %u %c", c1, d1, c2);
    
        return 0;
    }
    

    Das Problem bleibt nach wie vor das Gleiche.

    Ich gebe einen beliebigen Buchstaben und anschließend eine beliebige Ziffer ein. Dann unterbricht die Eingabe und mir werden der erste Buchstabe und die Ziffer ausgegeben.
    Nach dem zweiten Buchstaben wird garnicht gefragt.
    Nun bin ich ratlos...

    Meine Eingabe sieht wie folgt aus:

    // Text blabla...
    
    Geben Sie zuerst ein Zeichen, dann eine vorzeichenlose Dezimalzahl
    und zuletzt wieder ein Zeichen ein.
    

    // meine Eingabe

    a [Enter]
    3 [Enter]

    // die anschließende Ausgabe
    
    [b]a 3[/b]
    

    MfG spence



  • Spence schrieb:

    So langsam macht sich die Depression breit...

    // meine Eingabe
    [b]a[/b] [Enter]
    [b]3[/b] [Enter]
    

    So, kein Grund zur Depression, jetzt nimmst Du Deine Urversion her und gibst ein:

    s 3 z [Enter]
    

    und freust Dich erstmal 😃 und dann liest Du nochmal ganz genau alles zu scanf() durch.
    Das Enter ist je nach System ein Newline oder CarriageReturn/NewLine und daran verschluckt sich scanf(), weil es mehr "nichtdruckbare Zeichen" liest, als Du denkst. Das ist alles ... 😉



  • Ja, könnte fast einleuchten.

    Aber scanf() setzt doch kein \0 ans Ende eines characters, so wie das bei einem String der Fall ist. Diese hat ja auch nur 8 bit, oder hab ich da was falsch verstanden.

    Lustiger Weise hab ich, wie von dir vorgeschlagen, meinen "Urcode" hergenommen und jetzt funktioniert das ganze auf einmal auch mit der Eingabe

    [b]x[/b] [Enter]
    [b]4[/b] [Enter]
    [b]r[/b] [Enter]
    

    Es liegt scheinbar auch nicht an den Buchstaben und Zahlen, hab es mit mehreren Kombinationen versucht, es muss eine Laune meines Computers sein...

    Ich danke euch für eure Mühe und werde das mal beobachten. Vielleicht erklärts mir mein PC ja irgendwann mal 😃

    MfG spence

    EDIT:
    Keine zwei Minuten hat es gedauert, da trat das Problem wieder auf...
    Nun kommt hinzu, dass ich per Menü in die genannte Funktion springe. Natürlich lese ich den Menüpunkt ebenfalls mit scanf() ein - wie sollte es anders sein 🙄 - und prombt nimmt die Funktion mir nur noch einen Wert ab...
    An dieser Stelle funktioniert dann nur noch die Option von pointercrash(). Also danke nochmal.


Anmelden zum Antworten