Eigene itoa implementation
-
Hallo.Ich möchte meine eigene itoa Implementation machen,um ein integer in ein String zu konvertieren.Meine Funktion funktioniert nicht.Kann mir jemand sagen was falsch sein könnte?
int myitoa(int n,char s[],int msize) { int i,sign,digit; const char p[] = "0123456789"; sign = n; i = 0; while (i < msize-1) { digit = n%10; n/=10; s[i] = p[digit]; i++; } if (sign < 0 && i < msize-1) { s[i] = '-'; i++; } s[i] = '\0'; return(i); }
msize ist hierbei der Puffer im Main.
-
Joe1903 schrieb:
Hallo.Ich möchte meine eigene itoa Implementation machen,um ein integer in ein String zu konvertieren.
Wieso?
EDIT: Ich sollte hier was klarstellen: die Idee, sein eigenes
itoa
zu implementieren, ist berechtigt - Anzeichen dafür sehe ich in deinem Code aber nicht, außer des Minuszeichens wegen.Wenn's dir um Geschwindigkeit geht, dann sag ich dir: lass es.
sscanf
ist langsam, aber wenigstens überall vorhanden.Hast du dir mal die Mühe gemacht, Ausgaben nach jedem Berechnungsschritt einzufügen? Ich glaube nicht. Solltest du mal versuchen.
-
dachschaden schrieb:
Joe1903 schrieb:
Hallo.Ich möchte meine eigene itoa Implementation machen,um ein integer in ein String zu konvertieren.
Wieso?
EDIT: Ich sollte hier was klarstellen: die Idee, sein eigenes
itoa
zu implementieren, ist berechtigt - Anzeichen dafür sehe ich in deinem Code aber nicht, außer des Minuszeichens wegen.Wenn's dir um Geschwindigkeit geht, dann sag ich dir: lass es.
sscanf
ist langsam, aber wenigstens überall vorhanden.Hast du dir mal die Mühe gemacht, Ausgaben nach jedem Berechnungsschritt einzufügen? Ich glaube nicht. Solltest du mal versuchen.
Es geht darum,dass ich die Version vom K&R (Exercise 3.4) mit einem Mapping lösen muss anstatt die Binärdarstellung vorauszusetzen (z.B + '0')
-
Joe1903 schrieb:
Meine Funktion funktioniert nicht.
Was läuft falsch,
Wie stellst du das fest?dachschaden schrieb:
dann sag ich dir: lass es.
sscanf
ist langsam, aber wenigstens überall vorhanden.sscanf
würde einatoi
ersetzen, das aber auch überall vorhanden ist.
-
DirkB schrieb:
sscanf
würde einatoi
ersetzen, das aber auch überall vorhanden ist.Ech, habe das krass mit
sprintf
verwechselt. Mein Fehler, mein Fehler.
-
DirkB schrieb:
Joe1903 schrieb:
Meine Funktion funktioniert nicht.
Was läuft falsch,
Wie stellst du das fest?dachschaden schrieb:
dann sag ich dir: lass es.
sscanf
ist langsam, aber wenigstens überall vorhanden.sscanf
würde einatoi
ersetzen, das aber auch überall vorhanden ist.Angenommen ich teste -214.Dann kommt als Ergebnis -24 raus.
Ich lasse das Ergebnis zuvor noch reversen.
-
Kannst du nicht lesen?
dachschaden schrieb:
Hast du dir mal die Mühe gemacht, Ausgaben nach jedem Berechnungsschritt einzufügen? Ich glaube nicht. Solltest du mal versuchen.
Gibt einen Grund, warum ich das gesagt habe, denn an der Funktion stimmt eine Menge nicht.
msize
sollte einsize_t
sein. Größen sind immersize_t
.s[]
ist als Deklaration valid, aber ungewöhnlich. Nimm lieber direkt die Zeiger-Syntax, dann weiß jeder beim Lesen, was gemeint ist.
3. Wenn du -214 der Funktion übergibst, was meinst du, wiedigit
undn
aussehen? Ich will's dir zeigen:
-21|-4 -2|-1 0|-2 0|0 0|0 0|0 0|0 0|0 0|0
Hättest du ganz von alleine drauf kommen können, wenn du nur mal deinen Verstand eingeschaltet hättest.
4. Und noch eine Sache: wenn man einen größeren Buffer übergibt, als benötigt wird, dann wird der Rest einfach genullt. Und am Ende ist dann kein Platz mehr für das Minuszeichen. Du willst noch zusätzlich einen Check auf deine Zahl haben. Am besten dann, wenn du eine Zahl bereits garantiert geschrieben hast, für den Fall, dass der Caller nur 0 übergeben hat.
-
probier mal den ...
#include <stdio.h> char* myitoa (long n, char s[]) { if (n < 0) { s[0] = '-'; return myitoa(-n, s+1); } if (n/10 > 0) s = myitoa(n/10, s); s[0] = '0' + (n%10); s[1] = '\0'; return &s[1]; } int main() { char buff[32]; myitoa (1234, buff); puts (buff); myitoa (-9876, buff); puts (buff); }
-
unreg8696969 schrieb:
probier mal den ...
Probier mal selber mit LONG_MIN (aus <limits.h> ) als Argument.
Da rächt sich dann auch, dass du keine Buffergröße beachtest.
-
DirkB schrieb:
unreg8696969 schrieb:
probier mal den ...
Probier mal selber mit LONG_MIN (aus <limits.h> ) als Argument.
Da rächt sich dann auch, dass du keine Buffergröße beachtest.das abfangen von sonderfällen kann man ja noch nachrüsten.
-
[quote="Joe1903"]Angenommen ich teste -214.Dann kommt als Ergebnis -24 raus./quote]Demnach liegt ein Problem bei negativen Zahlen.
Wie dachschaden schon angedeutet hat, liefert der % Operator auch negative Werte.
Das liegt daran, dass negative Ergebnisse bei der Ganzzahldivision gegen Null gerundet werden.Es gilt immer a/b + a%b = aEs gilt immer b(a/b) + a%b = a*
h](Nach Hinweis von unreg8696969 geändert)[/h]Du erwartest bei -5/7 als Ergebnis 0. Damit die Gleichung erfüllt ist, muss -5%7 dann -5 ergeben.
-
DirkB schrieb:
Es gilt immer a/b + a%b = a
nee alter: b*(a/b) + a%b = a
ist richtig (bei integer arithmetik)
-
unreg8696969 schrieb:
DirkB schrieb:
Es gilt immer a/b + a%b = a
nee alter: b*(a/b) + a%b = a
ist richtig (bei integer arithmetik)Ich wußte doch, dass etwas falsch war
Danke.
-
DirkB schrieb:
unreg8696969 schrieb:
DirkB schrieb:
Es gilt immer a/b + a%b = a
nee alter: b*(a/b) + a%b = a
ist richtig (bei integer arithmetik)Ich wußte doch, dass etwas falsch war
Danke.ist schon okay. du bist wenigstens nicht so arrogant wie die anderen penner hier. du kannst dir das erlauben.