Newbie: Integer to String

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Newbie: Integer to String

Beitrag von chris_1981_ » Mo Jul 15, 2013 8:40 pm

Hallo zusammen,

ich weiß dass es für mein Vorhaben sprintf oder dtostr gibt, aber ich möchte verstehen was da passiert.
Vorallem benötige ich eine schlankere Funktion, denn das ganze ziehlt irgendwann auf einen Microcontroller.
Im nächsten Schritt soll eine Float Zahl dahingehend zum String konvertiert werden.

Könnte mir vielleicht Jemand erklären, was genau an gewissen stellen passiert?
Was auch klar ist, ein vorzeichen wird bis jetzt noch nicht ausgewertet.

Code: Alles auswählen

int main (void)
{
    // definiere und deklariere 
    // eine constanten character 
    char const digit[] = "0123456789";

    // definiere und deklariere
    // ein character
    char b[5];

    // definiere einen pointer
    char *b_p;

    // definiere den pointer mit
    // dem indexstelle 0
    b_p = &b[0];

    // definiere und deklariere
    // einen Integer
    int m = 77;

    // definiere und kopiere 
    // den integer m nach shifter
    int shifter = m;

    // ab hier gibt es von meiner seite
    // verständnisprobleme

    // Führe diese schleife
    // mindestens einmal aus.
    do
    { 
        // -->?
        ++b_p;
        // -->?
        shifter = shifter/10;
    }
    while(shifter);

     // -->?
    *b_p='\0';

    do
    { 
        // -->?
        *--b_p = digit[m%10];
        // -->?
        m = m/10;
    }
    while(m);
    
    // gebe den umgewandelten string aus
    printf ("Ergebnis == %s \n", b);

    // gebe eine 0 zurück
    // um das main erfolgreich 
    // zu beenden
    return 0;
}
warum müssen 2 "do while" schleifen durchlaufen werden?
Wieso kann ich dieses Vorhaben nur mit Pointer realisieren?
Vielen Dank fürs Lesen.

Und Danke für die Mühe.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Newbie: Integer to String

Beitrag von mfro » Mo Jul 15, 2013 9:05 pm

chris_1981_ hat geschrieben: Könnte mir vielleicht Jemand erklären, was genau an gewissen stellen passiert?
Was auch klar ist, ein vorzeichen wird bis jetzt noch nicht ausgewertet.

Code: Alles auswählen

int main (void)
{
    // definiere und deklariere 
    // eine constanten character 
    char const digit[] = "0123456789";

    // definiere und deklariere
    // ein character
    char b[5];

    // definiere einen pointer
    char *b_p;

    // definiere den pointer mit
    // dem indexstelle 0
    b_p = &b[0];

    // definiere und deklariere
    // einen Integer
    int m = 77;

    // definiere und kopiere 
    // den integer m nach shifter
    int shifter = m;

    // ab hier gibt es von meiner seite
    // verständnisprobleme

    // Führe diese schleife
    // mindestens einmal aus.
    do
    { 
        // -->?
        ++b_p;
        // -->?
        shifter = shifter/10;
    }
    while(shifter);

     // -->?
    *b_p='\0';

    do
    { 
        // -->?
        *--b_p = digit[m%10];
        // -->?
        m = m/10;
    }
    while(m);
    
    // gebe den umgewandelten string aus
    printf ("Ergebnis == %s \n", b);

    // gebe eine 0 zurück
    // um das main erfolgreich 
    // zu beenden
    return 0;
}
warum müssen 2 "do while" schleifen durchlaufen werden?
Wieso kann ich dieses Vorhaben nur mit Pointer realisieren?
Vielen Dank fürs Lesen.

Und Danke für die Mühe.
Wirklich interessant ist eigentlich nur die zweite Schleife. Sie wandelt jeweils den Rest der durch 10 geteilten Zahl in das entsprechende Nummernzeichen. Die erste Schleife macht eigentlich nichts anderes, als festzustellen, wieviele Zeichen gebraucht werden (bei der Methode muß man sich von rechts nach links durch die Zahl hangeln).

Man kann's auch so machen (das ist vielleicht einfacher zu verstehen):

Code: Alles auswählen

do {
        *b_p++ = digit[m % 10];
} while ((m /= 10) > 0);

*b_p = '\0';   /* Stringende */

printf("Ergebnis: %s\n", strrev(buffer));
Mal "von Hand" durchgespielt:

m = 15
digit[m % 10] = 5 (15 / 10 = 1, Rest 5 -> schreibe eine "5")
m = m / 10 = 1 (15 / 10 = 1)
Nächster Durchlauf:
digit[m % 10] = 1 (1 / 10 = 0, Rest 1 -> schreibe eine "1")

Entweder schreibt man von rechts nach links oder dreht am Ende den String einmal um.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Newbie: Integer to String

Beitrag von cloidnerux » Mo Jul 15, 2013 10:03 pm

Wieso kann ich dieses Vorhaben nur mit Pointer realisieren?
Man kann das auch ohne Pointer machen, aber Pointer machen vieles einfacher.
aber ich möchte verstehen was da passiert.
Diese Funktion eignet sich super, um sie selber zu implementieren.

Auch in hinblick auf einen µC ist es sehr praktisch zu wissen, wie das funktioniert, da kann man sich an einigen Ecken noch etwas an Zeit sparen.

Die Grundfrage bei dem Ganzen lautet ja egt: Wie wandle ich eine Ziffer zwischen 0 und 9 in sein Korrespondierendes Zeichen um und wie bekomme ich aus einer Zahl die Ziffer an einer bestimmten stelle.
Redundanz macht wiederholen unnötig.
quod erat expectandum

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: Newbie: Integer to String

Beitrag von GilbertDur » Mo Jul 15, 2013 10:08 pm

Ist das eigentlich ein C-Code, der von nem C++ Compiler ausgeführt wird? Denn ansonsten kompiliert das Ding gar nicht, weil eine Variable angelegt wird, nachdem eine andere bereits initialisiert wurde.

Man braucht den Zeiger übrigens nicht unbedingt. Der dient in diesem Beispiel nur der komfortableren Arbeit mit dem Ziel-Array.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Newbie: Integer to String

Beitrag von chris_1981_ » Di Jul 16, 2013 5:28 pm

Hallo zusammen,

entschuldigt die Rückfrage, aber das habe ich nicht verstanden, warum soll der Compiler
diese Code nicht übersetzen?
Ist das eigentlich ein C-Code, der von nem C++ Compiler ausgeführt wird? Denn ansonsten kompiliert das Ding gar nicht, weil eine Variable angelegt wird, nachdem eine andere bereits initialisiert wurde.

Man braucht den Zeiger übrigens nicht unbedingt. Der dient in diesem Beispiel nur der komfortableren Arbeit mit dem Ziel-Array.
@mfro
danke für deine ausführliche Erklärung, darf ich sagen, dass ich es noch nicht ganz gecheckt habe?
ich habe versucht printf Statements einzubinden, aber der Groschen ist noch nicht ganz gefallen
bzw. sehe ich noch das Ergebnis.

Ich erkenne ja das du die "strrev" funktionen nutzen willst,
jetzt bin ich grad dabei das ganze ohne auszuführen.
Ich schaue mal wie weit ich komme.

Vielen Dank!

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Newbie: Integer to String

Beitrag von cloidnerux » Di Jul 16, 2013 7:41 pm

entschuldigt die Rückfrage, aber das habe ich nicht verstanden, warum soll der Compiler
diese Code nicht übersetzen?
Weil in C90 Variablen Deklaration nur am Anfang eines Blocks erlaubt war. Also mitten im Code eine neue Variable zu deklarieren war nicht möglich.
Egt sollte das seit C99 erlaubt sein, ich weiß nicht was GilbertDur für Compilereinstellungen verwendet.
Ich erkenne ja das du die "strrev" funktionen nutzen willst,
jetzt bin ich grad dabei das ganze ohne auszuführen.
Ich schaue mal wie weit ich komme.
Man braucht für die Wandlung von Integer zu String kein strrev?

Und wie gesagt, die Konversion ist nicht dramatisch kompliziert und basiert nur darauf, die einzelnen Ziffern der jeweiligen Repräsentation zu bekommen und dann in das äquivalente Zeichen umzuwandeln.
Das ist das, was in den Codes gemacht wird.
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Newbie: Integer to String

Beitrag von mfro » Di Jul 16, 2013 8:33 pm

chris_1981_ hat geschrieben:...aber der Groschen ist noch nicht ganz gefallen bzw. sehe ich noch das Ergebnis.
Lehn' dich mal zurück und betrachte das Problem mal völlig unabhängig vom Programmieren. Hilft. Erst musst Du den Algorithmus verstehen, bevor Du versuchst, ihn zu programmieren.

Du hast eine Zahl und musst die in die ihr entsprechenden Zahlzeichen übersetzen (gar nicht so einfach, im "normalen Leben" benutzt man beides synonym). Vielleicht ist's einfacher, mal "ganz altmodisch" zum Rechnen die Finger zuhilfe zu nehmen?
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Newbie: Integer to String

Beitrag von chris_1981_ » Di Jul 16, 2013 9:12 pm

Hallo zusammen,

okay, danke ersteinmal für eure Geduld und überhaupt danke für die Mühen.
Ich bin davon ausgegangen, dass Ihr mich in der Luft zerflückt, da ich mit so einem "kinderkram" um die Ecke gekommen bin, für diese "Enttäuschung" vielen Dank! :D

Also, ich denke ich habe es wohl verstanden, will es aber nochmals genau wissen.

ich habe einen Integer i = 77 und will diesen zu einem String umwandeln.
Ich nehme die Zehnerstelle und danach die Einerstelle und lese die stelle 7 im character digit [+1], in meinem Fall 2 mal 77.
Jetzt meine Frage richtig verstanden?

Ich bin grad dabei, auch wenn es für andere sehr einfach ist, diesen "Kinderkram" in die Einzelteile aufzudröseln.
Um diesen zu kapieren.
Beispiel:

Code: Alles auswählen


char b[5];
char *b_p;

b_p = &b;

int m = 78;

*++b_p = digit[i%10];

printf ("String = %s", b_p);

Danke und schönen Abend.

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: Newbie: Integer to String

Beitrag von GilbertDur » Di Jul 16, 2013 9:13 pm

cloidnerux hat geschrieben: Weil in C90 Variablen Deklaration nur am Anfang eines Blocks erlaubt war. Also mitten im Code eine neue Variable zu deklarieren war nicht möglich.
Egt sollte das seit C99 erlaubt sein, ich weiß nicht was GilbertDur für Compilereinstellungen verwendet.
Natürlich einen, der C99 nicht komplett beherrscht (Microsoft halt *hüstel*).
Schön, dass es ab C99 geht. Ich muss zugeben, dass ich nicht so der C-Programmierer bin und es daher schlichtweg nicht wusste. Wieder was gelernt :mrgreen:

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Newbie: Integer to String

Beitrag von cloidnerux » Di Jul 16, 2013 9:20 pm

Natürlich einen, der C99 nicht komplett beherrscht (Microsoft halt *hüstel*).
Schön, dass es ab C99 geht. Ich muss zugeben, dass ich nicht so der C-Programmierer bin und es daher schlichtweg nicht wusste. Wieder was gelernt :mrgreen:
Ich hab mal mit turboC angefangen, da war das noch ein Thema. Danach hat sich kein Compiler, weder M$ noch gcc beschwert.
ich habe einen Integer i = 77 und will diesen zu einem String umwandeln.
Ich nehme die Zehnerstelle und danach die Einerstelle und lese die stelle 7 im character digit [+1], in meinem Fall 2 mal 77.
Jetzt meine Frage richtig verstanden?
So in etwa. Was du halt willst ist die Transformation aus der Zahl x in eine Textmäßige Repräsentation "xyz"
Also aus 59 als Zahl den String "59". Und eben die Umformung jeder einzelnen Ziffer in das entsprechende Zeichen und aneinanderreihen erfüllt diese Transformation.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten