Integer -> Char -> ASCII



  • Huhu liebe Community 🙂

    Ich tüfftle jetz schon ewig an der Aufgabenstellung, dir mir mein Prof. gestellt hat. Man soll in eine Int-Variable eine riesige Zahl einlesen können und diese dann in einen String umwandeln.
    Die Aufgabenstellung an sich ist dämlich... Aber ich hab mir gedacht, man kann jetz den String mit Hilfe der Moduladivision in 2er Päckchen verpacken und diese dann eben in Char umwandeln und als ASCII ausgeben.

    Das erste Problem ist, dass ich eben nur einen Zahlenbereich von 01 - 99 hab und eben nur beschränkte ASCII Zeichen darstellen kann. Das ist aber denk ich nicht so schlimm - ausser es gibt einen simpleren Trick die Aufgabe zu lösen.

    Das zweite Problem ist, dass wenn ich die ganze Int Zahl in 2er Päcken verpacken möchte, dass ich ja schon nach dem 1. mal Moduladivision eine 4-stelle Zahl bekomme, wenn ich den Teiler jeweils von 100 auf 10000 usw. erhöhe.

    Bin verwirrt 😕



  • Musst du das von Hand schreiben können? Ansonsten gibt es die Funktion itoa () 😉



  • ja natürlich von Hand schreiben *g* Das ist Grundkurs C, und naja - irgendwie sollte dass dann auch ganz einfach sein -.- Isses aber nich *g*



  • kleines Beispiel:

    int main()
    {
        char tmp[11];
        int i = 9;
        unsigned int a = 4114711471;
    
        tmp[10] = 0;
    
        do{
            tmp[i--] = (a%10)+48 ;
    
        } while (a/=10);
    
        // tmp+i = Anfangsadresse des Strings
    }
    

    😉



  • tmp+i+1 == Anfangsadresse des Strings



  • mikey schrieb:

    Musst du das von Hand schreiben können? Ansonsten gibt es die Funktion itoa () 😉

    Welches nicht Standard-C ist.



  • balduin schrieb:

    kleines Beispiel:

    a/=10
    

    sehr schön, vielen lieben dank! Das hab ich gesucht 🙂 Mich wundert das aber, da wir aber normal keine Bsp zum Üben bekommen, die Befehle brauchen die wir nicht kennen. Aber ne andere Lösung scheint es ja nicht zu geben.

    🙂 Schöne Feiertage

    Update:

    Oh hehe... tut mir Leid, bin noch etwas sehr unerfahren 🙂 Also mit nur "/" anstelle von "/=" würd es ja auch gehen - ganze vergessen - es ist ja ein Int...

    Was macht denn genau /= ?



  • a /= 10
    

    ist das selbe wie

    a = a / 10
    

    Gruß
    zeigerzeiger



  • Nur mit / würde es vermutlich nicht gehen - x/=n; ist eine Abkürzung für x=x/n; (das gibt's auch für etwa ein Dutzend weitere binäre Operatoren)



  • Oder die rekursive Variante:

    void printd(unsigned long n) {
        unsigned long i;
        if (i = n / 10)
            printd(i);
        putchar(n % 10 + '0');
    }
    

    '0' ist meistens 48, aber es muss ja nicht sein.



  • Noch ne kurze Zwischenfrage da ich das so noch nie angewendet habe.

    Foglendes Coding:

    if (i = n / 10)
    
    while (a/=10)
    

    Aus welchem logischen Ansatz sind die Bedingungen denn wahr bzw. unwahr.
    Bei Division werden doch nie "-" Werte erreicht, die dann nicht in einen unsigned int/long passen würden.

    Wie wird also hier entschieden ob die IF bzw. WHILE Bedingung wahr ist?

    Danke 🙂



  • codefrag schrieb:

    Wie wird also hier entschieden ob die IF bzw. WHILE Bedingung wahr ist?
    Danke 🙂

    do{
    
            tmp[i--] = (a%10)+'0';
    
        } while (a/=10);
    

    a wird in der do-while Schleife nach jeder Division durch 10 kleiner (Ergebnis wird sofort zugewiesen und ausgewertet)
    ist das Ergebnis der Division kleiner als 1 wird a == 0 (false),(weil unsigned int keine Nachkommastellen hat) und die Schleife
    wird beendet.
    mfg



  • Ragdar schrieb:

    - ganze vergessen - es ist ja ein Int...

    kann man berücksichtigen:

    int main()
    {
        char tmp[12];
        int i = 10;
        int a = -2064345332;
        char vorzeichen = 0;
    
        tmp[11] = 0;
    
        if (a < 0)
        {
            a = -a;
            vorzeichen = '-';
        }
    
        do{
    
            tmp[i--] = (a%10)+'0';
    
        } while (a/=10);
    
        if (vorzeichen)
            tmp[i--] = vorzeichen;
        // tmp+i+1 == Anfangsadresse des Strings
    }
    

    mfg



  • balduin schrieb:

    a wird in der do-while Schleife nach jeder Division durch 10 kleiner (Ergebnis wird sofort zugewiesen und ausgewertet) ist das Ergebnis der Division kleiner als 1 wird a == 0 (false),(weil unsigned int keine Nachkommastellen hat) und die Schleife wird beendet.

    Alles klar. Da laut Defintion FALSE = 0 ist ... dann isses logisch 🙂

    Danke 👍


Anmelden zum Antworten