Integer zu String



  • Schau dir mal den %-Operator an. Mit dem kann man sowas einfach machen.

    Und nur dass du es weisst, printf(), strlen() und pow() benötigen auch einige Libraries 😉



  • Den Modulo-Operator kenne ich. Wäre logisch gesehen auch die Umkehrung des Multiplizierens mit dem Stellenwert. Trotzdem:

    Eine Zahl abcabc (wobei jede Variable für eine Stelle steht) setzt sich im Zehnersystem wie folgt zusammen: abc = a\*10^2 + b\*10^1 + c*10^0

    Daraus nun a zu extrahieren ist einfach: a=(int)abc/100a = (int)abc/100

    Für b sieht es schon komplizierter aus: b=abc(mod)100cb = abc (mod) 100 - c

    Und c ist wieder einfach: c=abc(mod)10c = abc (mod) 10

    Wie kann ich daraus nun einen allgemein gültigen Algorithmus machen, der auch für theoretisch unendlich viele Stellen gilt?

    Und nur dass du es weisst, printf(), strlen() und pow() benötigen auch einige Libraries

    Ja, du Witzbold. Die printfs sind selbstverständlich nur dazu da, um den Algorithmus zu testen. Ein strlen wirst du in meinem Quellcode nicht finden, weil ich das schon mit einer while-Schleife umschrieben habe. Bei pow gebe ich dir Recht - das muss ich noch durch eine eigene Funktion ersetzen. Aber eine selbstgeschriebene Funktion zum Potenzieren reeller Zahlen sollte das geringste Problem darstellen.



  • feigling schrieb:

    €dit: Ich also "char blah[100];" in "char blah[150];" ändere, weil ich merke, dass 150 besser ist von der Größe. Also nix mit malloc oder realloc 😉

    Genau deswegen sollte man auch Konstanten verwenden:

    #ifdef DEFINE
    #define MAX_BLAH 100
    #else
    const unsigned MAX_BLAH = 100;
    #endif
    

    Somit brauchst du nur die Konstante ändern und musst kein Risiko mit sizeof() eingehen ;).



  • condor schrieb:

    Nur weil ich ein Rad brauche, werde ich nicht gleich einen ganzen Lastwagen nehmen - verständlich, oder?

    Du nimmst ja auch nicht den ganzen Lastwagen, sondern nur das Rad davon 🙄 .

    Aber seis drum. Wenigstens lernst du was dabei, wenn du dir selber ne Funktion dazu schreibst. 🙂



  • AJ schrieb:

    Du nimmst ja auch nicht den ganzen Lastwagen, sondern nur das Rad davon 🙄 .

    Nein, das stimmt so nicht. Oder es wäre mir zumindest neu, nur die Teile aus einer Header-Datei zu inkludieren, die ich auch wirklich brauche. Ich kann entweder die ganze nehmen oder gar nicht.



  • condor schrieb:

    AJ schrieb:

    Du nimmst ja auch nicht den ganzen Lastwagen, sondern nur das Rad davon 🙄 .

    Nein, das stimmt so nicht. Oder es wäre mir zumindest neu, nur die Teile aus einer Header-Datei zu inkludieren, die ich auch wirklich brauche. Ich kann entweder die ganze nehmen oder gar nicht.

    Richtig (was das compilieren angeht), aber beim Linken wird trotzdem nur das Benötigte eingebaut und das ist dann nicht der komplette Include ;).
    Sozusagen hast du mit dem Include einen Plan vom Lastwagen. In dein Vehicel baust du aber nur das Rad vom Lastwagen ein. Beim Zusammenbauen deines Vehicels wird dann auch nur das Rad vom Lastwagen hergenommen und nicht auch noch der ganze Rest (ist ja unnötig ;)). Verständlich?



  • Da kann ich dir nicht widersprechen, weil ich es selber nicht besser weiß. Faktum ist aber, dass mein Executable um ganze 20kb größer wird, wenn ich die stdio inkludiere, nur um snprintf zu nutzen. Und das ist für mich inakzeptabel.



  • Programmierst du für Chips?? Ansonsten bringt es nicht viel die Größe deiner Datei zu minimieren. (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)



  • Ganz ehrlich sehe ich kein Problem mit sizeof, wenn man weiß, wie man es verwenden muss und ich werde mir bestimmt nicht alles mit Defines vollpflastern, nur damit ich kein sizeof nehmen muss :p



  • AJ schrieb:

    Programmierst du für Chips?? Ansonsten bringt es nicht viel die Größe deiner Datei zu minimieren. (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)

    compiliere es mal als release-version, und sag mal fuer was du eigentlich programmierst



  • condor schrieb:

    Bei pow gebe ich dir Recht - das muss ich noch durch eine eigene Funktion ersetzen. Aber eine selbstgeschriebene Funktion zum Potenzieren reeller Zahlen sollte das geringste Problem darstellen.

    Nope, du verstehst nicht. Du brauchst für den Algo keine pow() Funktion. Natürlich kann man es damit machen, ist aber keine gute Idee. Schau dir mal folgendes an

    int x = /*blabla*/;
    int d;
    do
    {
        d = x % 10;
        x /= 10;
    }
    while (x != 0);
    

    Was für Werte sind nun in d bei jedem Durchlauf?
    So ein Algo ist für die int -> String Konvertierung. Für die String -> int Konvertierung kann man sich aber leicht eine passende Umkehrform basteln.



  • feigling schrieb:

    Ganz ehrlich sehe ich kein Problem mit sizeof, wenn man weiß, wie man es verwenden muss und ich werde mir bestimmt nicht alles mit Defines vollpflastern, nur damit ich kein sizeof nehmen muss :p

    Normalerweise macht man sowas auch separat (eigene Datei) mit const und includiert sich das dann, wo man es braucht. Wie schon gesagt, es wird nicht umsonst so drauf getrimmt Konstanten zu verwenden und wenn man sie auch noch gesammelt wo hat, dann ist es noch leichter Änderungen vorzunehmen. Wie du es machst, musst du dich erst durch den Quellcode schlagen, um an die entsprechende Stelle zu kommen.
    Aber im Endeffekt bleibt es dir überlassen, wie du es machst, aber denke auch an die Leute, die einmal deinen Code warten müssen (und wenn du das selber bist).

    leo aka qsch schrieb:

    AJ schrieb:

    Programmierst du für Chips?? Ansonsten bringt es nicht viel die Größe deiner Datei zu minimieren. (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)

    compiliere es mal als release-version, und sag mal fuer was du eigentlich programmierst

    Wenn meinst du jetzt? Mich oder condor??



  • groovemaster schrieb:

    Was für Werte sind nun in d bei jedem Durchlauf?

    Die Stellen der Zahl von least zu most significant.

    Ich habe es nun aber so gelöst:

    unsigned long zahl = 1234567890;
    
        unsigned short intLen = 0;
        while (potenzieren(10, intLen)<zahl) intLen++;
        char str[11];
        for (i=0; i<intLen; i++) str[i] =  (zahl % potenzieren(10, intLen-i)) / potenzieren(10, intLen-1-i) + 48;
        str[intLen] = '\0';
    

    Funktioniert wunderbar. Nur das nächste Problem ist schon da: Strings verketten ...

    (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)

    Ja, selbstverständlich. Die Debuginformationen werden "weggestrippt" und das Programm ist - soweit möglich - auf Release gestellt.



  • Frage:

    Mir ist einens noch nicht ganz klar soll diese funktion nur in dezimal umwandel oder sollte die alle zahlensysteme(basen von 2 - unedlich) können.

    mfg



  • AJ schrieb:

    leo aka qsch schrieb:

    AJ schrieb:

    Programmierst du für Chips?? Ansonsten bringt es nicht viel die Größe deiner Datei zu minimieren. (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)

    compiliere es mal als release-version, und sag mal fuer was du eigentlich programmierst

    Wenn meinst du jetzt? Mich oder condor??

    condor meinte ich, er hats aber eh als release compiliert



  • condor schrieb:

    Ich habe es nun aber so gelöst:

    unsigned long zahl = 1234567890;
        
        unsigned short intLen = 0;
        while (potenzieren(10, intLen)<zahl) intLen++;
        char str[11];
        for (i=0; i<intLen; i++) str[i] =  (zahl % potenzieren(10, intLen-i)) / potenzieren(10, intLen-1-i) + 48;
        str[intLen] = '\0';
    

    Funktioniert wunderbar.

    Wers mag. Ich denke trotzdem, du solltest das nochmal überarbeiten. Wenn du das nur ein paar mal während der Laufzeit brauchst, ist es unerheblich. Aber zB für Parser, die exzessiven Gebrauch von solchen Sachen machen, ist es ziemlicher Overkill. Um es mal ein wenig bildlich darzustellen - das was du da machst, ist wie wenn jemand versucht in den 5 km entfernten Nachbarort zu gelangen, aber anstatt den direkten Weg zu nehmen, umrundet er die Erde einmal in entgegengestzte Richtung. Sicher, er kommt an, nur wirklich sinnvoll ist das nicht.

    nochwas:
    Statt den ASCII Codes solltest du Zeichen Literale verwenden (zB '0' statt 48). Das macht den Code verständlicher. Zudem ist str[11] etwas unterdimensioniert, für 32 bit unsigned longs mag das ausreichen, aber wenn long grösser ist, kann das schnell zu Buffer-Overflows führen.


Anmelden zum Antworten