atof() selber machen



  • hallo,

    vorweg: die frage/antwort gabs bestimmt schonmal, jedoch habe ich sie hier trotz langer suche nicht gefunde.

    jetzt zum problem. wie wandele ich eine char-array in eine floatzahl um? ich habs mit dieser algorithmik versucht:

    27.385 = 7×1 + 2×10 + 3× 1/10 + 8× 1/100 + 5× 1/1000

    jedoch ist heir das problem das der wer bei der ausgabe recht ungenau wird. 10.0 wird z.b. zu 9.52, wobei 10.00000000000000 auch wirklich zu 10.0 umgewandelt wird??

    hier mal mein quelltext dazu. für ideen wäre ich sehr dankbar... 👍

    #include <stdio.h>
    #include <string.h>
    
    #define K_FLOATLAENGE 30         
    
    int func_asciitofloat (char*,float*);
    
    int main()
    {
    
          char dummie;                              //DeBuGcOdE
    
    char sr_asciieingabe[K_FLOATLAENGE];
    
    float fr_ergebnis = 0;
    
       printf("Geben Sie den Wert ein der in einen Float umgewandelt werden soll");
       printf("Formatbeispiel: -12.343 ; +2.0 (Eingabe abschliessen mit RETURN)\n");
       printf("====> ");
    
       fflush(stdin);
    
       gets(sr_asciieingabe);
    
       func_asciitofloat(sr_asciieingabe,&fr_ergebnis);
       printf("\n\nIhre Eingabe wurde in folgende Float-Variable umgewandelt.");
       printf("\n====> %f",fr_ergebnis);
    
       printf("\n\n##### EnD oF pRoGrAmM ####\n");   //DeBuGcOdE
       fflush(stdin);                                //DeBuGcOdE
       scanf("%d", &dummie);                         //DeBuGcOdE
    }//END int main()
    
    //Function zum umwandeln eines Strings in einen Float.
    int func_asciitofloat (char*p_sr_asciieingabe,float*p_fr_ergebnis)
    {
    
    int ir_pospunkt;
    float fr_stwert; 
    int ir_zaehler; 
    float fr_zwischenergebnis = 0; 
    
       for(ir_zaehler=0;p_sr_asciieingabe[ir_zaehler] != '.';ir_zaehler++)
       {
          ir_pospunkt = ir_zaehler + 1;
       };
    
       fr_stwert = 1;
       for (ir_zaehler =(ir_pospunkt-1); ir_zaehler >=1;ir_zaehler--)
       {
          fr_zwischenergebnis = fr_zwischenergebnis + ((p_sr_asciieingabe[ir_zaehler]-48) * fr_stwert);
    
          fr_stwert = fr_stwert * 10;
       };
    
       fr_stwert = 0.1;
       for (ir_zaehler = ir_pospunkt+1; ir_zaehler <= strlen(p_sr_asciieingabe);ir_zaehler++)
       {  
        fr_zwischenergebnis = fr_zwischenergebnis + ((p_sr_asciieingabe[ir_zaehler]-48) * fr_stwert);
    
        fr_stwert = fr_stwert * 0.1;      
       };
    
       if (p_sr_asciieingabe[0] == '-')
          *p_fr_ergebnis = fr_zwischenergebnis * -1;
       else
          *p_fr_ergebnis = fr_zwischenergebnis;
    }//END int func_asciitofloat (char *p_sr_asciieingabe,float *p_fr_ergebnis)
    

    Edit by AJ: Code-Tags eingefügt



  • Wenn es dir nur darum geht, einen String in eine Kommazahl umzuwandeln, dann reicht das hier:

    char string[20] = "27.385";
    double kommazahl;
    
    sscanf(string, "%lf", &kommazahl);
    


  • WIE GEIL!!!!!!!!
    das ist echt 🕶 AJ. thx.

    ich programmiere jetzt ja auch schon ein bisschen länger (zwar nicht mit c) aber das es so eine einfache lösung gibt dachte ich nicht.

    gibs zu dem sscanf() evtl. irgendwo mal ne doku?? bzw. benutzt die funktion dann die funktion atof()? nur mal so als info, da es eigentlich komplett ohne diese funktion gemacht werden sollte *g*

    ps:thx für die ordentliche formatierung 😉



  • Hier ist die Doku

    Wie sscanf(), scanf(), ... implementiert sind, weiß ich nicht. Das liegt wahrscheinlich auch im Ermessen des Compilerherstellers. Genausogut kann es sein, dass atof() eigentlich sscanf() aufruft ( 😕 ).

    Wenn es Sinn der Übung sein soll, dass du die Funktionsweise von atof() nachprogrammierst, dann solltest du allerdings sscanf() nicht verwenden, sondern selber ein wenig rumtüffteln ;). Wenn das so ist, dann schauen wir uns deine Funktion nochmal genauer an.



  • ja, wir haben da ne aufgabenstellung alá ".. atof darf nirgendswo verwendet werden...". andere funktionen sind aber nicht verboten 😃

    den fehler habe ich jetzt schon selbst gefunden. der string den ich einlese besteht aus der zahl, nem (ich glaube) zeilenumbruchzeichen und den \0 fürs ende.
    mit meiner methode habe ich den zeilenumbruch auch mit reingerechnet 😡
    bis ich das raus bekommen habe....

    jetzt ist nur noch wenn ich z.b. -123.456 eingeben rechnet der das zu -123.4560001 um. ist dass das los der einfachen genauigkeit???



  • Wahrscheinlich. Warum nimmst du eigentlich keinen double her?



  • ja, unser "dozenten" will das in nem float haben...

    meinen test zufolge macht das keinen unterschie ob ich erst mit double rechne und es dann nem float zuweise oder es direkt so mache..

    kann das sein, dass ich das falsch getestet habe.... ?!



  • Bei deiner dritten Schleife dürfte der Fehler liegen. Mach mal bei der Bedingung nicht <= sondern nur <.



  • hmmm... jo stimmt, das letzt zeichen iust ja keine "zahl" mehr... thx


Anmelden zum Antworten