itoa() und sprintf() linksbündig???

Gast #35055
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
Gast #35056
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
Gast #35057
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
Gast #35058
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?
Gast #35059
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
Gast #35061
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...
Gast #35065
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;..."
Gast #35067
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
Gast #35068
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren