Hallo zusammen! Ich grübel zur Zeit an einer Funktion, die mir eine Integer-Zahl in die einzelnen Dezimal-Stellen zerlegt. Also wenn ich z.B. 3426 übergebe, soll mir die Funktion einzeln 3, 4, 2 und 6 zurück geben (evtl. in einem Array). Die Funktion an sich ist mir nicht so wichtig, mich interessiert vor allem der benätigte Algorithmus. Wahrscheinlich ist das Problem trivial und schon tausend mal gelöst, aber ich komme einfach nicht auf einen grünen Zweig. Bin für alle Ideen/Vorschlöge dankbar! Gruß Daniel
3426 / 1000 = 3 (3426 - 3*1000) / 100 = 4 (3426 - 3*1000 - 4*100) / 10 = 2 (3426 - 3*1000 -4*100 - 2*10) = 6 usw. Sind alles Integerdivisionen.
hmm das ward variante a die nur funzt wenn du die zahl kennst also ruß.->tschuldigung. besser geht das mit dem modulo opperator % dieser führt eine ganzahldivison aus und gibt den rest als rückgabewert. also in c -syntax .... x=3246; a=x%10; x=x/10; b=x%10; x=x/10; ..... !! a wäre dann also 6, b wäre also 4, .... !!! und noch eines bei dieser variante zerlegst du dir dein x ! natürlich kann man das auch in ne schleife packen und dabei dann jedesmal denn arrayindesx erhöhen. Mischa
sehr bewährt: x ist int array[4] ist unsigned char array[3] = x / 1000; array[2] = x % 1000 / 100; array[1] = x % 100 / 10; array[0] = x % 10;
So geht's auch Beispiel bei 16 stelliger Zahl int i=0; int zahl_i = 1234567890123456; char zahl_c[17]; snprintf(zahl_c, sizeof(zahl_c), "%d", zahl_i); dann ist zahl_c[0]=1 zahl_c[1]=2 zahl_c[2]=3 .... usw strlen(zahl_c) gibt die Anzahl der Char Elemente in dem Array zurück (bis zur Terminierung mit \0); in diesem Fall 16
kleine Ergänzung, natürlich kann ein 16 bit int nicht 1234567890123456 gross werden -fs-
@Frank Stehen in dem array dann nicht die Ascii Codes der Zahlen drin?
@Tobi, koennte sein, dann z.B. mit atoi(zahl_c[x]) wieder in int konvertieren. -fs-
verdammt, warum vergess ich nur immer die Hälfte, ich glaube das "%d" beim snprintf bewirkt dass die Int Zahl auch als solche im Char Array steht. Habe gerade keine Entwicklungsumgebung bzw Debugger hier um's auszuprobieren, hab sowas aber schon öfter auf obige Weise gelöst. -fs-
atoi lohnt sich da nicht, es reicht das: zahl = zahl_c[0] - 48; usw... Aber macht doch nix, der Ansatz stimmt doch :)
oder so: char *numstr (unsigned int v) { static char t[10] = {0,0,0,0,0,0,0,0,0,0}; char *p = t + 9; while(1) { unsigned int z = v/10; *p = '0' + (char)(v-(z<<3)-(z<<1)); if (!z) break; v = z; p--; } return p; } aufrufen dann so: char *p = numstr(12345); in p[0] steht dann '1', in p[1] '2' usw. p[5] enthält eine 0 als ende-kennung
Gibt es auch so eine Funktion für float Werte ? spezielle Anwendung: ADC-Werte auf 7 Segment darstellen.
> zahl = zahl_c[0] - 48;
Ist prinzipiell schon richtig.
Nur schreibs als:
zahl = zahl - '0';
Sieht erstens besser aus.
Zweitens muss sich niemand fragen warum
den nu 48
Drittens geht das dann auf jedem System, auch
wenn es nicht ASCII benutzt.
> Gibt es auch so eine Funktion für float Werte ?
itoa = int to alphanumeric
ftoa = float to alphanumeric
... falls dein Compiler diese Funktionen überhaupt anbietet.
Beides sind nicht-standard Funktionen.
Ansonsten kannst Du immer sprintf benutzen. Das hat dann
auch den Vorteil, daß Du die Formatierung wesentlich besser
steuern kannst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.