die alte leier mit char und double (mit hilfe von strtod)



  • hallo,
    ich möchte eine reelle zahl einlesen können und mich nicht darauf verlassen, dass der nutzer sich nicht vertippt. also war mein plan 💡 , dies mit getchar() zu tun und die zeichen in ein array zu packen, dies mit strtod in double zu wandeln und zu testen, ob der liebe nutzer quark eingegeben hat oder nicht. soweit so gut.
    bei dem code unten funktioniert das allerdings nur, wenn man mindestens 3 zeichen eingibt. gibt man z.bsp. 22 ein, funktioniert es nicht und ich weiss nicht warum 😕

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
        int n = 0;
        char eingabe, zutesten[n], *endptr;
        double ergebnis;
        printf("Bitte geben Sie eine Zahl ein: ");
        eingabe = getchar();
        while(eingabe != '\n'){
            zutesten[n] = eingabe;
            eingabe = getchar();
            n++;
        }
        ergebnis = strtod(zutesten, &endptr);
        if(!*endptr){
            printf("Die Zahl ist %lf\n", ergebnis);    
        }
        return 0;
    }
    

    danke schonmal für ratschläge... 👍



  • Dein Fehler ist:

    int n = 0;
    char zutesten[n];
    

    (nebenbei: Wenn du eine ganze Zeile einlesen willst, dann nimm doch einfach man: fgets. Das ist einfacher als so eine Schleife)



  • danke für die antwort.
    hm, stimmt, dass array hätte in meinem fall ja nur ein feld 😮, hoppla. aber selbst wenn ich mit

    char zutesten[256]
    

    arbeite, läuft es aufs gleiche hinaus... 😕
    die schleife erstmal nur so...wegen aufgabenstellung 🤡



  • Abgesehen davon, dass man es sicher schöner lösen könnte, funktioniert dein Code bei mir auch mit ein oder zwei Zahlen (mit zutesten[256]). Du hast leider nicht gesagt, was genau da bei dir nicht funktioniert...



  • naja, ich erhalte einfach keine ausgabe. gehe ich das ganze zeile für zeile durch, überspringt das programm die if-abfrage einfach. kompiliert wird das ganze mit gcc4.3.3, geschrieben in codeblocks10.05, das gleiche ergebnis mit visual studio 2008.



  • Auf was willst du denn mit if testen? *endptr enthält entweder das letzte Zeichen deiner Double oder ist nicht dereferenzierbar, da NULL. Vielleichte willst du eigentlich if(endptr) abfragen?



  • Warum verwendest du nicht die Funktion, welche zum Einlesen von Nutzereingaben von ANSI C bereitgestellt wird und wertest deren Rückgabewert aus?

    if( 1==scanf("%lf",&doublevar) )
      puts("OK");
    else
      puts("Nochmal!");
    

Anmelden zum Antworten