www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik itoa() und sprintf() linksbündig???


Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo!

habe soeben festgstellt, das itoa(), sprintf() usw. offensichtlich 
linksbündiges ergebnis generieren, also z.b.:

12345
1234
123
12
1

d.h. je kleiner die zahl ist, desto "linker"(brr, was für ein wort, 
sorry :-)) steht sie...

das stört mich schon ein wenig, hätte lieber rechtsbündiges 
ergebnis...kennt ihr eine elegante art, dies zu erreichen?

wäre für eure hilfe dankbar,

emil

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo emil,
sie stehen nicht linksbündig! Der String ist nach der letzten Ziffer mit 
'\0' abgeschlossen. Es ist keine fixe Breite. Ansonsten hilft da selbst 
umformatieren, indem die Zeichen+'\0' nach rechts geshiftet werden und 
links werden Spaces eingeschoben.

Grüße
Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo emil,

Kleine Hilfe noch von mir:

#define Breite 5

char a[10] = "123";
int i;
while (strlen(a) < Breite)
{
for (i= strlen(a); i >0; i--) a[i] = a[i-1];
a[0] = ' ';
}

danach ist a ="  123"

Zu beachten ist, daß a groß genug ist, um die Verschiebung aufnehmen zu 
können.

Grüße
Oliver

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi oliver,

das mit dem selber-string-verschieben habe ich mir auch gedacht, muss 
man halt machen...

unter "linksbündig" meinte ich, dass, wenn man ein array
definiert, z.b. text[10] und eine variable zahl=123 hat, bekommt man als 
ergebnis von:

itoa(zahl,text);

ein string array, der ungefähr so aussieht:

[123\0     ]

wenn man es jetzt gleich am lcd ausgibt, sieht das hässlich aus, 
besonders wenn mehrere zeilen mit zahlen versciedener breite 
untereinander ausgegeben werden mussen.

offensichtlich muss ich dann zuerst nach rechts verschieben, aber wieso 
hat man diese funktionen eigentlich so definiert, was macht das für 
einen sinn?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>offensichtlich muss ich dann zuerst nach rechts verschieben, aber wieso hat man 
diese funktionen eigentlich so definiert, was macht das für einen sinn?

Die Funktion weiss doch nicht, auf welche Breite sie formatieren soll. 
Vielfach möchte man diese konvertierte Zahl mit anderen Textteilen 
konkatenieren.
Also z.B.
Spannung = 5 V
Spannung = 50 V

Aber das sieht komisch aus, wenn man eine fixe Breite von 6 angibt:
Spannung =      5 V

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion itoa ist dazu da, einen Integer in einen String 
umzuwandeln, und genau das tut sie, nicht mehr und nicht weniger. Wenn 
du etwas mehr Komfort möchtest (und noch genug Speicher auf dem uC frei 
hast), dann kannst du printf bzw. sprintf verwenden.

Gruß
Andreas

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke, oliver, dein vorschlag ist gut!

ich habe leider ein array text[32,5], das macht das ganze
ein wenig aufwendiger :-)))

also mit deiner hilfe kriege ich das schon hin, hat mich nur gewundert, 
wieso ist die itoa() so komisch eingestellt...
c ist wirklich voll überraschungen...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie läßt es sich hier nur schwer formatierten Text eingeben:

>Aber das sieht komisch aus, wenn man eine fixe Breite von 6 >angibt:
Spannung = ______5 V

_ soll " " sein.

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@oliver: danke, sehr gute antwort

@andreas: sprintf() macht eigentlich genau dasselbe, sprich linksbündig 
ausgeben, habe gleich ausprobiert

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier's mal mit:

  printf("%6i", zahl)

Printf kann mehr als es auf den ersten Blick scheint, ergoogel dir mal 
eine ordentliche Beschreibung.

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@andreas:
ahaaaaa, danke, das war gut, andreas, habe soeben die "ordentliche" 
beschreibung der printf() gefunden (siehe unten) und siehe da - du hast 
tatsächlich recht!!! blöderweise gibt's sowas bei sprintf() nicht, das 
hat mich verwirrt...

ok, danke für eure hilfe, jungs, hat mir viel gebracht, danke!!!

emil





"The format specifier string has the following structure:

%[flags][width][.precision][l]type_char

The optional flags characters are:
  '-' LEFT_JUSTIFIES the result, padding on the right with spaces. If 
it's not present, the result will be right-justified, padded on the left 
with zeros or spaces;..."

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

bitte? sprintf sollte in einer konformen Implementierung der 
Standardfunktionen genau die gleichen Argumente verstehen wie printf. 
Siehe dazu
http://www.delorie.com/djgpp/doc/libc-2.02/

Wie sich das bei der libc des AVRGCC verhält kann ich nicht sagen da man 
auf µC sowieso kein printf/sprintf verwenden sollte. Sowas schreibt man 
selber.

Matthias

Autor: Sascha Weitkunat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Leerpost?! Nicht schlecht...

>blöderweise gibt's sowas bei sprintf() nicht, das hat mich verwirrt...

Natürlich gelten die Formatierungen auch für sprintf(), sprintf() ist 
nämlich nichts anderes als printf() mit explizit angegebenen Buffer in 
den die Ausgabe wandert.

sprintf(my_text, "Spannung: %6d V", spannung);

Ausgabe wenn Spannung 123 ist, '_' sind Leerzeichen:

Spannung: ___123 V

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo alle,

hatte gestern nacht wohl ein blackout; habe blind von einem beispiel

sprintf(my_text, "%-i", zahl);

kopiert, was ein linksbündiges ergebnis liefert;

sprintf(my_text, "%+i", zahl);

liefert dagegen ein rechtsbündiges ergebnis, was ich gebraucht habe...

sorry, euch aufgeregt zu haben, das nächste mal lese ich fleissig die 
funk. beschreibung, bevor ich blöde fragen stelle

emil

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias:
> da man auf µC sowieso kein printf/sprintf verwenden sollte

So allgemein würde ich das nicht sagen. Printf braucht beim AVR-GCC nur 
1 kB (Minimal-Version mit String und Integer) bis 5 kB (inkl. Float) 
Speicher, ein ATmega spürt das gar nicht mehr.

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.