itoa Funktion selbst schreiben
-
Hallöle,
auf meinem aktuellen Übungsblatt wird die Aufgabe gestellt eine Funktion
void itoa(int, char
zu schreiben, die einen int-Wert in ein Char-Array schreibt.
Durch googlen hab ich bereits herausgefunden, dass die Funktion in einer Bibliothek vorhanden ist. Leider konnte ich jedoch nirgends den Quellcode finden.
Ich will ihn nicht einfach nur abschreiben, aber momentan drängt die Zeit bei mir, da ich über die Feiertage sehr viel zu tun hatte.
Kann mir daher eventuell jemand sagen, wo ich den Quellcode finde?
Oder kann mir jemand einen Tipp geben, wie man die Funktion realisiert?Mein Problem für den Moment liegt in der Tatsache, dass ich nicht weiß, wie ich eine mehrstellige Zahl Ziffer für Ziffer ins Array lese...
(Zusatzfrage: Muss ich die Ziffern vorher noch zu Chars casten?)
Hat da jemand einen Tipp?Gruß
m0pf
-
m0pf schrieb:
Hat da jemand einen Tipp?
Selber überlegen?
Wie bekommst du von einer Zahl die letzte Ziffer?
Welche mathematische Operation macht dir das?
-
Übungsaufgaben sind dazu da, etwas allgemeines zu üben auch wenn das schon hinreichend gut gelöst worden ist. Probier dich selbst dran und lerne etwas, was du mit dem gelernten Verständnis woanders auch gebrauchen kannst.
Eine solche Frage verstehe ich nicht als Aufforderung, dafür einen effizienten Code liefern zu wollen.
Kleine Hinweise:
-- du liest nicht in den array, sondern schreibst ihn
-- der char-array braucht ein abschliessendes Nullzeichen
-
void itoa(int i, char *c) { sprintf(c, "%d%, i); }
-
Belli schrieb:
void itoa(int i, char *c) { sprintf(c, "%d%, i); }
ganz großes kino
-
Du meinst wohl: ganz großes kino%
-
Das sind noch die Prozente von der Silvesterfeier.
Frohes Neues!
-
_-- schrieb:
Belli schrieb:
void itoa(int i, char *c) { sprintf(c, "%d%, i); }
ganz großes kino
Stattdessen hättest Du einfach meinen Tippfehler berichtigen können:
void itoa(int i, char *c) { sprintf(c, "%d", i); }
-
Klar kann man das auch mit sprintf machen. Ist aber deutlich langsamer als die üblichen Funktion von itoa und entspricht wohl auch nicht dem Ziel der Übungsaufgabe.
daddeldu! :p
-
/* Copyright (c) Microsoft Corporation. All rights reserved. */ #include <mmlite.h> #include <stdlib.h> #include <tchar.h> /* 7.10.1.2 convert decimal string to int */ int __cdecl _ttoi(const _TCHAR *String) { UINT Value = 0, Digit; _TCHAR c; while ((c = *String++) != _EOS) { if (c >= '0' && c <= '9') Digit = (UINT) (c - '0'); else break; Value = (Value * 10) + Digit; } return Value; }
-
Dieser Code ist ja nicht zum aushalten.
Ausserdem konvertiert er in der falschen Richtung.
-
berniebutt schrieb:
Klar kann man das auch mit sprintf machen. Ist aber deutlich langsamer als die üblichen Funktion von itoa und entspricht wohl auch nicht dem Ziel der Übungsaufgabe.
Ich zitiere mal:
m0pf schrieb:
auf meinem aktuellen Übungsblatt wird die Aufgabe gestellt eine Funktion
void itoa(int, char
zu schreiben, die einen int-Wert in ein Char-Array schreibt.
-
void itoa(int i, char *c) // schreibt einen int-Wert in ein Char-Array { *(int *)c = i; }
-
google dein freund und he schrieb:
/* Copyright (c) Microsoft Corporation. All rights reserved. */ #include <mmlite.h> #include <stdlib.h> #include <tchar.h> /* 7.10.1.2 convert decimal string to int */ int __cdecl _ttoi(const _TCHAR *String) { UINT Value = 0, Digit; _TCHAR c; while ((c = *String++) != _EOS) { if (c >= '0' && c <= '9') Digit = (UINT) (c - '0'); else break; Value = (Value * 10) + Digit; } return Value; }
1. Das ist kein C.
2. Das soll wohl atoi darstellen, gefragt war aber itoaNaja, da der Thread ja schon ziemlich lange offen ist.. mein Vorschlag wäre:
Edit: Jetzt mit Vorzeichenchar *my_itoa(int val, char *string) { int digits = 0, tmp = val; if (val == 0) { string[0] = '0'; ++digits; } if (val < 0) { val *= -1; *string = '-'; ++digits; } while (tmp) { tmp /= 10; ++digits; } string[digits] = '\0'; while (val) { string[--digits] = val % 10 + '0'; val /= 10; } return string; }
Falls Du etwas nicht verstehst, frag
-
Also das einzige was ich nicht ganz verstehe ist die letzte while-Schleife.
Ich verstehe, dass zB bei "32" bei der modulo Rechnung "2" in das vorletzte Feldelement geschrieben wird.
Aber du änderst "val" ja gar nicht mehr. Wie komm ich denn dann an die "3"?
-
Da steht val /= 10; was ausgeschrieben heißt val = val / 10;
-
Meine Implementation ist um einiges schneller:
char *ifastoa (int value, char *str) { char *ps = str, *pt = str, tmpc; int tmp; do tmp = value, *ps++ = "9876543210123456789"[9 + tmp - 10 * (value /= 10)]; while (value); if (tmp < 0) *ps++ = '-'; for (*ps-- = '\0'; pt < ps; tmpc = *ps, *ps-- = *pt, *pt++ = tmpc) ; return str; }
Idee: String erst verkehrt herum schreiben und dann umkehren (Zeile 8).
Dann erspart man sich die digits-Zählerei.Das mit dem
"9876543210123456789"
ermöglicht eine portable (von ASCII unabhängige) Umwandlung.
-
Ich habe auch noch was anzubieten:
char *my_itoa(int val, char *a) { char *e=a,*o=a,sign=val<0; do *e++="0123456789"[abs(val%10)]; while( val/=10 ); for( sign?*e++='-':1,*e--=0; a < e; *a ^= *e,*e ^= *a,*a++ ^= *e-- ); return o; }