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

Gast #35055
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
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
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
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
>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
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 #35062
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.
Gast #35065
@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
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
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

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.