Integer zu String



  • Ich weiß jetzt nicht genau, was da zu ungenau ist O_o

    char buffer[10];
    unsigned int i = 20;
    
    snprintf(buffer, sizeof(buffer), "%u", i); 
    
    printf("%s\n", buffer);
    

    sprintf(buffer, "%u", i); könnte man auch nehmen, wobei das ned vor Buffer-Überläufen schützt.



  • feigling schrieb:

    sprintf(buffer, "%u", i); könnte man auch nehmen, wobei das ned vor Buffer-Überläufen schützt.

    sizeof(buffer) aber auch nur bedingt ;). Wenn man die maximale Größe weiß, sollte man sie auch genau angeben.



  • und innerhalb einer Funktion (wenn buffer ein Parameter ist) bekommt man die Größe des Pointers und nicht die Länge.



  • AJ schrieb:

    feigling schrieb:

    sprintf(buffer, "%u", i); könnte man auch nehmen, wobei das ned vor Buffer-Überläufen schützt.

    sizeof(buffer) aber auch nur bedingt ;). Wenn man die maximale Größe weiß, sollte man sie auch genau angeben.

    Jo, das stimmt. Bei dem kleinen Codestückchen kann man auch einfach die Zahl reinsetzen, allerdings nutze ich sonst immer sizeof, wenn ich z.B. nen Char-Array mehrmals benutze. Bei ner Änderung der Arraygröße muss man sonst alles in der Fkt verändern, daher nehme ich so gut wie immer sizeof.

    supertux schrieb:

    und innerhalb einer Funktion (wenn buffer ein Parameter ist) bekommt man die Größe des Pointers und nicht die Länge.

    Tjo, man muss halt wissen, was man tut und wie man sizeof verwenden kann 🙂



  • feigling: Versteh ich das richtig:

    Bei ner Änderung der Arraygröße muss man sonst alles in der Fkt verändern, daher nehme ich so gut wie immer sizeof.

    Du machst sowas:

    char* arr = malloc(10);
    ...
    arr = realloc(15);
    
    // und damit du immer brav die Größe kennst machst du:
    for(int i = 0; i < sizeof(arr); ++i)
       blubba;
    

    ??

    MfG SideWinder



  • Nein, nur wenn ich sowas habe:

    char blah[100];

    also nen char-Array, welches in der Fkt selbst deklariert ist.

    €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 😉



  • feigling schrieb:

    Ich weiß jetzt nicht genau, was da zu ungenau ist O_o

    char buffer[10];
    unsigned int i = 20;
    
    snprintf(buffer, sizeof(buffer), "%u", i); 
    
    printf("%s\n", buffer);
    

    Hm, na ja, nicht sehr schöne Möglichkeit. Außerdem müsste ich dann nur wegen snprintf die ganze stdio inkludieren. Wird sicher eine andere Methode auch geben.



  • Das einzige was daran imho nicht schön ist, ist die Tatsache, dass 10 Zeichen zuwenig sind um ein unsigned int in einen String zu packen...

    Und was ist das Problem, die stdio.h einzubinden? Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?



  • condor schrieb:

    Hm, na ja, nicht sehr schöne Möglichkeit. Außerdem müsste ich dann nur wegen snprintf die ganze stdio inkludieren. Wird sicher eine andere Methode auch geben.

    Ja gibt es, selber schreiben. 🙂 Ist auch nicht schwer, und das meine ich ernst.



  • groovemaster schrieb:

    Ja gibt es, selber schreiben. 🙂 Ist auch nicht schwer, und das meine ich ernst.

    Ja, versuche ich im Moment auch gerade. Bin aber noch nicht sehr weit und wäre einer Hilfestellung nicht abgeneigt.

    Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?

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



  • ehm

    condor schrieb:

    Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?

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

    ich glaube du verstehst da was falsch



  • condor schrieb:

    groovemaster schrieb:

    Ja gibt es, selber schreiben. 🙂 Ist auch nicht schwer, und das meine ich ernst.

    Ja, versuche ich im Moment auch gerade. Bin aber noch nicht sehr weit und wäre einer Hilfestellung nicht abgeneigt.

    Dann schreib einfach mal wie weit du bist, bzw poste einfach deinen bisherigen Code. Die Forensuche wird zu "manuellen" int <-> string Konvertierungen sicherlich auch einiges ausspucken.



  • leo aka qsch schrieb:

    ehm

    condor schrieb:

    Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?

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

    ich glaube du verstehst da was falsch

    Das glaube ich allerdings auch...



  • @leo aka qsch & TactX: Glaubensfragen könnt ihr mit eurem Religionslehrer diskutieren; hier sind sie jedenfalls fehl am Platz. Wenn ihr nichts zu meinem Problem beitragen könnt, dann lasst es doch bitte.

    @groovemaster: Ich bin den umgekehrten Weg gegangen und habe mir eine Funktion geschrieben, wie ich einen String in einen Integer umwandeln könnte, was kein Problem war:

    char str[11] = "112399";
        printf("Zahl als String: %s\n", str);
    
        int strLen = 0;
        while (str[strLen] != 0) ++strLen;
        printf("Laenge des Strings: %d\n", strLen);
    
        int i;
        int zahl = 0;
        for (i=0; i<strLen; i++)
        {
            zahl += (str[i]-48)*pow(10, strLen-i-1);
        }
        printf("Zahl als Integer: %d\n", zahl);
    

    Nun ja, das wollte ich entsprechend abändern und bin nur bis zur Hälfte gekommen:

    unsigned long zahl = 32;
        printf("Zahl als Integer: %d\n", zahl);
    
        int intLen = 0;
        while (pow(10, intLen)<zahl) intLen++;
        printf("Stellen des Integers: %d\n", intLen);
    

    Es wird - ähnlich wie bei strLen - gezählt, wie viele Stellen der Integer hat. Jetzt müsste es doch leicht möglich sein, die einzelnen Stellen zu extrahieren und in einen Char-Array zu packen. Ich schaffe es aber nicht.



  • 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?


Anmelden zum Antworten