Integer zu String
-
Das einzige was daran imho nicht schön ist, ist die Tatsache, dass 10 Zeichen zuwenig sind um ein unsigned int in einen String zu packen...
Und was ist das Problem, die stdio.h einzubinden? Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?
-
condor schrieb:
Hm, na ja, nicht sehr schöne Möglichkeit. Außerdem müsste ich dann nur wegen snprintf die ganze stdio inkludieren. Wird sicher eine andere Methode auch geben.
Ja gibt es, selber schreiben.
Ist auch nicht schwer, und das meine ich ernst.
-
groovemaster schrieb:
Ja gibt es, selber schreiben.
Ist auch nicht schwer, und das meine ich ernst.
Ja, versuche ich im Moment auch gerade. Bin aber noch nicht sehr weit und wäre einer Hilfestellung nicht abgeneigt.
Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?
Nur weil ich ein Rad brauche, werde ich nicht gleich einen ganzen Lastwagen nehmen - verständlich, oder?
-
ehm
condor schrieb:
Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?
Nur weil ich ein Rad brauche, werde ich nicht gleich einen ganzen Lastwagen nehmen - verständlich, oder?
ich glaube du verstehst da was falsch
-
condor schrieb:
groovemaster schrieb:
Ja gibt es, selber schreiben.
Ist auch nicht schwer, und das meine ich ernst.
Ja, versuche ich im Moment auch gerade. Bin aber noch nicht sehr weit und wäre einer Hilfestellung nicht abgeneigt.
Dann schreib einfach mal wie weit du bist, bzw poste einfach deinen bisherigen Code. Die Forensuche wird zu "manuellen" int <-> string Konvertierungen sicherlich auch einiges ausspucken.
-
leo aka qsch schrieb:
ehm
condor schrieb:
Willst du lieber das Rad neu erfinden und dabei Fehler machen, die nicht sein müssen?
Nur weil ich ein Rad brauche, werde ich nicht gleich einen ganzen Lastwagen nehmen - verständlich, oder?
ich glaube du verstehst da was falsch
Das glaube ich allerdings auch...
-
@leo aka qsch & TactX: Glaubensfragen könnt ihr mit eurem Religionslehrer diskutieren; hier sind sie jedenfalls fehl am Platz. Wenn ihr nichts zu meinem Problem beitragen könnt, dann lasst es doch bitte.
@groovemaster: Ich bin den umgekehrten Weg gegangen und habe mir eine Funktion geschrieben, wie ich einen String in einen Integer umwandeln könnte, was kein Problem war:
char str[11] = "112399"; printf("Zahl als String: %s\n", str); int strLen = 0; while (str[strLen] != 0) ++strLen; printf("Laenge des Strings: %d\n", strLen); int i; int zahl = 0; for (i=0; i<strLen; i++) { zahl += (str[i]-48)*pow(10, strLen-i-1); } printf("Zahl als Integer: %d\n", zahl);
Nun ja, das wollte ich entsprechend abändern und bin nur bis zur Hälfte gekommen:
unsigned long zahl = 32; printf("Zahl als Integer: %d\n", zahl); int intLen = 0; while (pow(10, intLen)<zahl) intLen++; printf("Stellen des Integers: %d\n", intLen);
Es wird - ähnlich wie bei strLen - gezählt, wie viele Stellen der Integer hat. Jetzt müsste es doch leicht möglich sein, die einzelnen Stellen zu extrahieren und in einen Char-Array zu packen. Ich schaffe es aber nicht.
-
Schau dir mal den %-Operator an. Mit dem kann man sowas einfach machen.
Und nur dass du es weisst, printf(), strlen() und pow() benötigen auch einige Libraries
-
Den Modulo-Operator kenne ich. Wäre logisch gesehen auch die Umkehrung des Multiplizierens mit dem Stellenwert. Trotzdem:
Eine Zahl (wobei jede Variable für eine Stelle steht) setzt sich im Zehnersystem wie folgt zusammen: abc = a\*10^2 + b\*10^1 + c*10^0
Daraus nun a zu extrahieren ist einfach:
Für b sieht es schon komplizierter aus:
Und c ist wieder einfach:
Wie kann ich daraus nun einen allgemein gültigen Algorithmus machen, der auch für theoretisch unendlich viele Stellen gilt?
Und nur dass du es weisst, printf(), strlen() und pow() benötigen auch einige Libraries
Ja, du Witzbold. Die printfs sind selbstverständlich nur dazu da, um den Algorithmus zu testen. Ein strlen wirst du in meinem Quellcode nicht finden, weil ich das schon mit einer while-Schleife umschrieben habe. Bei pow gebe ich dir Recht - das muss ich noch durch eine eigene Funktion ersetzen. Aber eine selbstgeschriebene Funktion zum Potenzieren reeller Zahlen sollte das geringste Problem darstellen.
-
feigling schrieb:
€dit: Ich also "char blah[100];" in "char blah[150];" ändere, weil ich merke, dass 150 besser ist von der Größe. Also nix mit malloc oder realloc
Genau deswegen sollte man auch Konstanten verwenden:
#ifdef DEFINE #define MAX_BLAH 100 #else const unsigned MAX_BLAH = 100; #endif
Somit brauchst du nur die Konstante ändern und musst kein Risiko mit sizeof() eingehen ;).
-
condor schrieb:
Nur weil ich ein Rad brauche, werde ich nicht gleich einen ganzen Lastwagen nehmen - verständlich, oder?
Du nimmst ja auch nicht den ganzen Lastwagen, sondern nur das Rad davon
.
Aber seis drum. Wenigstens lernst du was dabei, wenn du dir selber ne Funktion dazu schreibst.
-
AJ schrieb:
Du nimmst ja auch nicht den ganzen Lastwagen, sondern nur das Rad davon
.
Nein, das stimmt so nicht. Oder es wäre mir zumindest neu, nur die Teile aus einer Header-Datei zu inkludieren, die ich auch wirklich brauche. Ich kann entweder die ganze nehmen oder gar nicht.
-
condor schrieb:
AJ schrieb:
Du nimmst ja auch nicht den ganzen Lastwagen, sondern nur das Rad davon
.
Nein, das stimmt so nicht. Oder es wäre mir zumindest neu, nur die Teile aus einer Header-Datei zu inkludieren, die ich auch wirklich brauche. Ich kann entweder die ganze nehmen oder gar nicht.
Richtig (was das compilieren angeht), aber beim Linken wird trotzdem nur das Benötigte eingebaut und das ist dann nicht der komplette Include ;).
Sozusagen hast du mit dem Include einen Plan vom Lastwagen. In dein Vehicel baust du aber nur das Rad vom Lastwagen ein. Beim Zusammenbauen deines Vehicels wird dann auch nur das Rad vom Lastwagen hergenommen und nicht auch noch der ganze Rest (ist ja unnötig ;)). Verständlich?
-
Da kann ich dir nicht widersprechen, weil ich es selber nicht besser weiß. Faktum ist aber, dass mein Executable um ganze 20kb größer wird, wenn ich die stdio inkludiere, nur um snprintf zu nutzen. Und das ist für mich inakzeptabel.
-
Programmierst du für Chips?? Ansonsten bringt es nicht viel die Größe deiner Datei zu minimieren. (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)
-
Ganz ehrlich sehe ich kein Problem mit sizeof, wenn man weiß, wie man es verwenden muss und ich werde mir bestimmt nicht alles mit Defines vollpflastern, nur damit ich kein sizeof nehmen muss :p
-
AJ schrieb:
Programmierst du für Chips?? Ansonsten bringt es nicht viel die Größe deiner Datei zu minimieren. (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)
compiliere es mal als release-version, und sag mal fuer was du eigentlich programmierst
-
condor schrieb:
Bei pow gebe ich dir Recht - das muss ich noch durch eine eigene Funktion ersetzen. Aber eine selbstgeschriebene Funktion zum Potenzieren reeller Zahlen sollte das geringste Problem darstellen.
Nope, du verstehst nicht. Du brauchst für den Algo keine pow() Funktion. Natürlich kann man es damit machen, ist aber keine gute Idee. Schau dir mal folgendes an
int x = /*blabla*/; int d; do { d = x % 10; x /= 10; } while (x != 0);
Was für Werte sind nun in d bei jedem Durchlauf?
So ein Algo ist für die int -> String Konvertierung. Für die String -> int Konvertierung kann man sich aber leicht eine passende Umkehrform basteln.
-
feigling schrieb:
Ganz ehrlich sehe ich kein Problem mit sizeof, wenn man weiß, wie man es verwenden muss und ich werde mir bestimmt nicht alles mit Defines vollpflastern, nur damit ich kein sizeof nehmen muss :p
Normalerweise macht man sowas auch separat (eigene Datei) mit const und includiert sich das dann, wo man es braucht. Wie schon gesagt, es wird nicht umsonst so drauf getrimmt Konstanten zu verwenden und wenn man sie auch noch gesammelt wo hat, dann ist es noch leichter Änderungen vorzunehmen. Wie du es machst, musst du dich erst durch den Quellcode schlagen, um an die entsprechende Stelle zu kommen.
Aber im Endeffekt bleibt es dir überlassen, wie du es machst, aber denke auch an die Leute, die einmal deinen Code warten müssen (und wenn du das selber bist).leo aka qsch schrieb:
AJ schrieb:
Programmierst du für Chips?? Ansonsten bringt es nicht viel die Größe deiner Datei zu minimieren. (Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)
compiliere es mal als release-version, und sag mal fuer was du eigentlich programmierst
Wenn meinst du jetzt? Mich oder condor??
-
groovemaster schrieb:
Was für Werte sind nun in d bei jedem Durchlauf?
Die Stellen der Zahl von least zu most significant.
Ich habe es nun aber so gelöst:
unsigned long zahl = 1234567890; unsigned short intLen = 0; while (potenzieren(10, intLen)<zahl) intLen++; char str[11]; for (i=0; i<intLen; i++) str[i] = (zahl % potenzieren(10, intLen-i)) / potenzieren(10, intLen-1-i) + 48; str[intLen] = '\0';
Funktioniert wunderbar. Nur das nächste Problem ist schon da: Strings verketten ...
(Wie man die Debuginformationen wegbekommt, weißt du ja, oder??)
Ja, selbstverständlich. Die Debuginformationen werden "weggestrippt" und das Programm ist - soweit möglich - auf Release gestellt.