Hi, ich habe einen Integer (uint32_t) Wert in einem Register stehen. Was
wäre da eine einfache Möglichkeit die letzten drei Stellen durch ein
Komma von den davorstehenden zu trennen. Habe schon nach passenden
Stringfunktionen gesucht aber noch keine gefunden. Wie kann ich die
integer in C eigentlich in einen String Array Umwandeln?
Gruß Bernd
Ich hoffe ich versteh dich richtig. Du hast einen Integerwert (z.B.
1234) und möchtest das in einen String-Array mit drei Nachkommastellen
("1,234") umwandeln.
Mein Vorschlag wäre:
sprintf(str, "%i,%i", i/1000, i%1000);
"i" ist deine Integervariable, "str" dein String-Array
Ich merke grad, die Namensgebung mit dem "i" war schlecht gewählt.
Besser:
sprintf(str, "%i,%i", k/1000, k%1000);
"k" ist deine Integervariable, "str" dein String-Array
habe es ausprobiert. sieht irgentwie nicht ganz richtig aus. der wert
wird nicht durch tausend geteilt und ist vom wert her jetzt völlig
falsch. das komma wird richig angezeigt
Wie kann ich jetzt noch die letzten zwei ziffern nicht mit anzeigen?
also aus 25,123 -> 25,1 machen?
bisher siehts so aus: snprintf(text, LÄNGE, "%u,%u", (int/1000),
(int%1000))
geht das dass ich einfach das letzte argument nochmal durch 100 teil
also ((int%1000)/100) ?
Ein kleiner 'Schönheitsfehler' ist immer noch drinnen.
Probier mal mit
> snprintf(text, LÄNGE, "%u,%u", (int/1000), (int%1000))
die Zahl 3005 auszugeben. Wenn auf deinem Display dann
3,5 steht, dann wars das wohl nicht wirklich
snprintf(text, LÄNGE, "%u,%03u", (int/1000), (int%1000))
behebt das (Änderung im Formatstring)
der 3er bedeutet, dass das Ausgabefeld in dem der int ausgegeben
werden soll, 3 Zeichen lang ist (und die Zahl wird dort rechts-
bündig ausgegeben). Die 0 davor bedeutet, dass führende Nullen
in diesem Feld tatsächlich als 0 ausgegeben werden und nicht als
Leerzeichen. Die von 3005 abgesplittete 5 wird also als 005
ausgegeben und damit ergibt sich das korrekte 3,005
Ok, vielen Dank an alle. Hier mal mein Ergebnis:
snprintf(string, LAENGE,"%u,%01u", (adcval/1000), ((adcval%1000)/100));
so funktioniert es genau so wie ich es gewollt habe. :-)
Was ist eigentlich der Unterschied zwischen sprintf und snprintf?
Und weiß jemand warum bei mir utoa ganz falsche Zahlen geliefert hat?
Gruß Bernd
@Stefan: Ne dauert bei mir leider viel länger, da ich meinen
Mikrocontroller erst mal aus dem Sockel nehmen und ihn in meinen
Programmer setzten muss. Dazu kommt noch das mir mitlerweile schon ein
Beinchen abgebrochen ist und ich deshalb immer ein stück Draht mit
reinklemme... Ok müßte es nicht unbedingt im Mikrocontroller probieren
...
Gruß Bernd
> Was ist eigentlich der Unterschied zwischen sprintf und snprintf?
sprintf ist gefährlich und sollte nicht verwendet werden, weil es nicht
überprüfen kann, ob der als erstes Argument übergebene Puffer
ausreichend groß ist. Das kann zum berühmten "buffer overflow" und
äußerst schwer zu lokalisierenden Fehlern führen.
snprintf bekommt als zweites Argument die Länge des als erstes Argument
übergebenen Puffer mitgeteilt, so kann sichergestellt werden, daß auch
nur der Puffer beschrieben wird.
Aus diesem Grund sollte man tunlichst die Finger von allen
string-Funktionen lassen, die kein Längenargument haben.
schlecht gut
--------------------
sprintf snprintf
strcpy strncpy
strcat strncat
etc.
Ok danke schön. Wie sieht das eigentlich für Mikrocontroller aus? Da ich
festgestellt habe das snprintf deutlich mehr Resources braucht als
sprintf und bei Mikrocontrollernanwendungen eigentlich die Sicherheit
meistens unrelevant ist, wäre da nicht sprintf besser? Bei mir wird ja
nur ein Temperaturwert auf einem Display angezeit. Und ab wann muß ich
mir wieder gedanken um die Sicherheit machen? Ab den Zeitpunkt zu dem
ich z.B. eine Netzwerkschnittstelle einbau?
es geht hier wohl kaum um die sicherheit vor einbrüchen. du kannst dir
nur recht leicht programmierfehler einfangen die du nur irre schwer
wieder lokalisieren kannst. es ist also eine hilfe für dich als
programmierer!
Gruß
Fabian
> Da ich festgestellt habe das snprintf deutlich mehr Resources> braucht als sprintf ...
Das hat hier irgendwann schon mal jemand behauptet. Wieso sollte das so
sein?
Hatte zumindest den Eindruck, da ich die Funktion mal beide ausprobiert
habe und sich nach dem compilieren die dateigröße unterscheidet. Und da
ja im Mikrocontroller nur begrenzt speicherplatz vorhanden ist ...
kann aber auch sein das ich das verwechselt habe, da ich auch zwischen
druch mit der funktion utoa rumpobiert habe. werde es nochmal testen
wenn ich daheim bin.