Zahl in einen c-string schreiben, OHNE CRT-Funktionen



  • Hallo wie kann ich beispielsweise eine Zahl in einer long-Variable in einen C-String schreiben, ohne dabei auf stringstreams, oder irgendwelche anderen 'fertigen-Funktionen/Klassen' zurückzugreifen ?

    Also Beispiel:

    char szZahlAlsString[50];
    long lWert = 12325465821;
    // szZahlAlsString soll lWert enthalten!
    

    Ich danke schon mal den später Helfenden 😉 .

    :xmas1:



  • Naja, musst Dir halt jede einzelne Stelle ausrechen, indem Du forwaehrend durch 10 teilst / den Rest bestimmst. Und das dann halt jeweils im String speichern.



  • So zum Beispiel:

    char* toString( char* dst, long x )
    {
        if( x < 0 )
        {
            *dst++ = '-';
            x = -x;
        }
        const long z = x / 10;
        if( z > 0 )
            dst = toString( dst, z );
        *dst =  '0' + char(x % 10);
        return ++dst;
    }
    
    int main()
    {
        char szZahlAlsString[50];
        long lWert = 123254658; // 12325465821 ist zu groß für einen 32bit-long-Wert
        toString( szZahlAlsString, lWert ); 
        return 0;
    }
    

    Ist aber nicht zu empfehlen, besser ist es std::ostringstream zu benutzen. Die Funktion toString hat keinen Check auf Überlauf von 'dst'. Beachte bitte auch, dass 'toString' keine '\0' an's String-Ende schreibt. Das kannst Du aber leicht mit

    *toString( szZahlAlsString, lWert ) = char(0); // String-Ende anfügen
    

    nachholen.

    Gruß
    Werner



  • Jops danke euch, hab ich. Und wie mach ich das bei Gleitkommazahlen (-> double) ?

    Thx schonmal!



  • Du zerlegst sie in den Vor- und Nachkomma-Anteil. Den Vorkomma-Anteil kannst du wie int behandeln, dann setzt du ein Komma und gibst die Nachkomma-Stellen einzeln aus:

    for(i=0;i<precision;++i)
    {
      nachkomma*=10;
      *dst = '0' + char(nachkomma);
      ++dst;
    }
    

    (für wissensachftliche Darstellung mußt du erst durch 10^x dividieren und am Ende "Ex" anhängen)

    PS: Darf man fragen, was du gegen die Standard-Funktionen?



  • CStoll schrieb:

    Du zerlegst sie in den Vor- und Nachkomma-Anteil.

    Schon klar, aber wie ?



  • CStoll schrieb:

    PS: Darf man fragen, was du gegen die Standard-Funktionen?

    Vielleicht steht in den Hausaufgaben, dass man die nicht benutzen darf, um das Problem zu lösen 😃 😉



  • Uji, hab Deine Frage übersehen:
    Nein, also ehrlich gesagt will ichs nur aus Interesse wissen, außerdem dürften doch selbstgecodete Fkt's möglichweise schneller sein :p

    Also Ideen ? 😉



  • STRING schrieb:

    ... außerdem dürften doch selbstgecodete Fkt's möglichweise schneller sein :p

    Nö ... nach meiner Erfahrung sind sie meistens langsamer und habe mehr Fehler. Vorausgesetzt es handelt sich um die selbe Funktionalität. Haben sie weniger, so können sie schneller sein - wir hatten doch neulich mal so'n Thread über C- und C++-IO. Die Fehler bleiben.

    Gruß Werner :xmas2:



  • Habt ihr trotzdem eine Lösung für mich ? *bitte*





  • Danke für den Link, aber irgendwie funktioniert dieser Code überhaupt nicht und ich versteh auch irgendwie nicht ganz, was da gemacht wird. Könntest Du mit vielleicht eine kleine Beispielfunktion schreiben ? -Vieln Dank schonmal!!



  • #include <stdio.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    #define code
    #define bit char
    #define DIGITS 6
    
    void outint( int val )
    {
      uint code TEST[] = { 10, 100, 1000, 10000 };
      uchar d, i;
      bit zero;
      uint uval = val;
    
      if( val < 0 ){
        uval = -val;
        putchar( '-' );
      }
    
      zero = 1;
      i = 4;
      do{
        i--;
        for( d = '0'; uval >= TEST[i]; uval -= TEST[i] ){
          d++;
          zero = 0;
        }
        if( zero == 0 )
          putchar( d );
      }while( i );
    
      putchar( (uchar)uval + '0' );
    }
    
    void outfloat( float val )
    {
      char ep, dp, i, num;
    
      if( val < 0 ){
        val = -val;
        putchar( '-' );
      }
      ep = 0;
      if( val != 0 ){
        if( val < 1 ){
          val *= 1000;
          ep = -3;
        }
    
        if( val >= 1000 ){
          val *= 0.001;
          ep = 3;
        }
      }
    
      for( dp = 1; val >= 10; val *= 0.1 )		// normalize (x.xxx)
        dp ++;
    
      for( i = DIGITS;; ){				// n digits
        putchar( (num = val) + '0' );		// get digit
        if( --i == 0 )
          break;
        if( --dp == 0 )				// set decimal point
          putchar( '.' );
        val = (val - num) * 10;			// next digit
      }
      if( ep ){
        putchar( 'e' );
        outint( ep );
      }
    }
    
    void main()
    {
        outfloat (0.1345);
        putchar ('\n');
        outfloat (99.998);
        putchar ('\n');
    }
    

    ...musst nur noch statt 'putchar' aufzurufen in ein array schreiben 🙂 :xmas2:


  • Mod

    yuck - stdio.h
    yuck - #define
    yuck - void main

    schon mal was von Division gehört? Der Teil für floats ist auch nicht gerade sonderlich genau (für eine Ausgabefunktion ist das fatal!). Die Techniken, die hier benutzt werden um gewissen Beschränkungen der Zielplattform gerecht zu werden, sind für eine Demonstration eher nicht geeignet.



  • camper schrieb:

    schon mal was von Division gehört? Der Teil für floats ist auch nicht gerade sonderlich genau. Die Techniken, die hier benutzt werden um gewissen Beschränkungen der Zielplattform gerecht zu werden, sind für eine Demonstration eher nicht geeignet.

    hey, das ist nicht von mir. ich hab's nur kopiert und die demonstration zeigt wie man's benutzen kann. dass die funktionen noch stark verbesserungswürdig sind, hab' ich auch schon vermutet..
    :xmas2:



  • Hm ok, der Code läuft! Danke!

    Allerdings gibt es das mit diesem e ... aus, ich brauch aber NUR Kommazahlen, also komplett ohne 'e'^^, wie kann ich das realisieren ?

    und Danke nochmal!


  • Mod

    net schrieb:

    hey, das ist nicht von mir. ich hab's nur kopiert

    So ganz ohne Kommentar machst du es dir aber schon zu eigen. Jedenfalls bezog sich meine Kritik auf den Code an sich, wenn du dich angesprochen fühlst, muss das wohl schlechtes Gewissen sein 😉



  • STRING schrieb:

    Allerdings gibt es das mit diesem e ... aus, ich brauch aber NUR Kommazahlen, also komplett ohne 'e'^^, wie kann ich das realisieren ?

    guck dir mal die funktion an (wofür ist 'ep' z.b. da) und versuch die zu verstehen. vielleicht reichts auch, wenn du DIGITS vergrösserst. etwas mehr eigeninitiative bitte 😉

    camper schrieb:

    So ganz ohne Kommentar machst du es dir aber schon zu eigen. Jedenfalls bezog sich meine Kritik auf den Code an sich, wenn du dich angesprochen fühlst, muss das wohl schlechtes Gewissen sein 😉

    ich hab' doch den link gepostet, daran sieht man dass nicht von mir ist (ich würde niemals die {} so übel setzen). ach, mist, jetzt verfalle ich wieder in den rechtfertigungs-modus 😉


Log in to reply