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
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
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
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?
>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
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
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...
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.
@oliver: danke, sehr gute antwort @andreas: sprintf() macht eigentlich genau dasselbe, sprich linksbündig ausgeben, habe gleich ausprobiert
Probier's mal mit: printf("%6i", zahl) Printf kann mehr als es auf den ersten Blick scheint, ergoogel dir mal eine ordentliche Beschreibung.
@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;..."
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
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
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.