Forum: Compiler & IDEs C Printf 2 Zahlen links- und rechtsbündig ausgeben mit 0er dazwischen


von Luky S. (luky)


Lesenswert?

Ich habe 2 Zahlen, die erste (eine ID) ist zwischen 1 und 8 Stellen lang 
und die 2. (Seriennummer) zwischen 1 und 12 Zeichen. Der Haken: aus 
historischen Gründen ist die ID linksbündig, also funktioniert %0 hier 
leider nur für die 2. Zahl (als %012d)
Soll also am Ende z.B. so aussehen: 12345670000987654321
Gibt es eine einfache Möglichkeit, einen String am Ende mit beliebigen 
Zeichen (hier halt 0) auf eine fixe Länge aufzublasen? In C# gibts dafür 
StringPadRight()?

von MaWin O. (mawin_original)


Lesenswert?

Multiplikation mit 10**x

von Yalu X. (yalu) (Moderator)


Lesenswert?

1
#include <stdio.h>
2
3
int main() {
4
  unsigned long a = 1234567, b = 987654321;
5
6
  int n = printf("%ld", a);
7
  printf("%0*ld", 20-n, b);
8
9
  return 0;
10
}

von Luky S. (luky)


Lesenswert?

Danke, das ist für mich aber etwas zu viel Adress-magic in C.

von Harald K. (kirnbichler)


Lesenswert?

Luky S. schrieb:
> Danke, das ist für mich aber etwas zu viel Adress-magic in C.

Da ist exakt gar keine "Adress-magic" vorhanden.
1
  int n = printf("%ld", a);

Das gibt den Wert "a" aus und liefert die Anzahl der ausgegebenen 
Stellen.

(Lass' Dich nicht vom l im Formatspezifizierer verwirren, der ist nur 
wegen des Datentyps long anstelle von int nötig)
1
  printf("%0*ld", 20-n, b);

Und das hier gibt den Wert "b" mit der angegebenen Stellenanzahl (20 - 
n) aus und zwar mit führenden Nullen.

Für die Werte
  unsigned long a = 1234567, b = 987654321;

ergibt sich also

n = 7 (da die Zahl sieben Stellen hat)

20 - 7 ist 13.

Die neunstellige Zahl b wird also mit vier vorangestellten Nullen 
ausgegeben.


Keine Adresse, nirgendwo. Auch keine Magie.

von Luky S. (luky)


Lesenswert?

"%0*ld" verstehe ich nicht
wieso nicht "%0ld"?

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Luky S. schrieb:
> "%0*ld" verstehe ich nicht

- https://en.cppreference.com/w/cpp/io/c/fprintf

Zitat daraus:
"integer value or * that specifies minimum field width. The result is 
padded with space characters (by default), if required, on the left when 
right-justified, or on the right if left-justified. In the case when * 
is used, the width is specified by an additional argument of type int, 
which appears before the argument to be converted and the argument 
supplying precision if one is supplied. If the value of the argument is 
negative, it results with the - flag specified and positive field width 
(Note: This is the minimum width: The value is never truncated.). "

von Luky S. (luky)


Lesenswert?

Wieder was gelernt, danke!

von Roland F. (rhf)


Lesenswert?

Luky S. schrieb:
> "%0*ld" verstehe ich nicht
> wieso nicht "%0ld"?

Zitat aus "Programmieren in C":
"Als Feldbreite oder Genauigkeit kann jeweils * angegeben werden; dann 
wird der Wert durch Umwandlung des nächsten Argumentes festgelegt (das 
ein int-Wert sein muß)."

rhf

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.