Forum: PC-Programmierung Integer mit Komma?


von Bernd (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

itoa

von Franko P. (sgssn)


Lesenswert?

wie wärs mit:

itoa(); (Syntax nachlesen, weiss ich nicht auswendig)
sprintf( str, "%f", val );

?
Das mit dem Komma hab ich nicht verstanden

gerhard

von Thorsten (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

z.b. macht er mir aus meiner zahl 25124 nicht wie gewollt 25,124 sondern 
35936,65 was ja irgendwie nicht stimmen kann.

von Bernd (Gast)


Lesenswert?

Ok - danke habs jetzt hinbekommen.

von Bernd (Gast)


Lesenswert?

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) ?

von Stefan (Gast)


Lesenswert?

probieren statt fragen! dauert gleichlang und schon nerven und zeit

von Karl H. (kbuchegg)


Lesenswert?

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



von Bernd (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

@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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Bernd W. (berndi)


Lesenswert?

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?

von Fabian B. (fabs)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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?

von Berndi (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.