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


von emil (Gast)


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

von Oliver (Gast)


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

von Oliver (Gast)


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

von emil (Gast)


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?

von Oliver (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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

von emil (Gast)


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

von Oliver (Gast)


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.

von emil (Gast)


Lesenswert?

@oliver: danke, sehr gute antwort

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Probier's mal mit:

  printf("%6i", zahl)

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

von emil (Gast)


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

von Matthias (Gast)


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

von Sascha Weitkunat (Gast)


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

von emil (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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.

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.