www.mikrocontroller.net

Forum: PC-Programmierung Integer mit Komma?


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
itoa

Autor: Franko Phil (sgssn)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok - danke habs jetzt hinbekommen.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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) ?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probieren statt fragen! dauert gleichlang und schon nerven und zeit

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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



Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd Wunder (berndi)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Berndi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen ganz massiven Codegrößenunterschied gibt es bei Verwendung von 
(s/n)printf mit oder ohne Float-Unterstützung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.