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
wie wärs mit: itoa(); (Syntax nachlesen, weiss ich nicht auswendig) sprintf( str, "%f", val ); ? Das mit dem Komma hab ich nicht verstanden gerhard
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
z.b. macht er mir aus meiner zahl 25124 nicht wie gewollt 25,124 sondern 35936,65 was ja irgendwie nicht stimmen kann.
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.
Einen ganz massiven Codegrößenunterschied gibt es bei Verwendung von (s/n)printf mit oder ohne Float-Unterstützung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.