itoa Funktion selbst schreiben
-
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; }