420 Stimmen

Führende 0's in C drucken

Ich versuche, eine gute Möglichkeit zu finden, führende 0 , wie zum Beispiel 01001 für eine Postleitzahl . Während die Nummer gespeichert werden würde als 1001 Was ist ein guter Weg, dies zu tun?

Ich dachte an die Verwendung von entweder case Aussagen oder if um herauszufinden, wie viele Ziffern die Zahl hat, und sie dann in eine char Array mit zusätzlichen 0 für den Druck, aber ich kann nicht umhin zu denken, dass es eine Möglichkeit gibt, dies mit dem printf Formatsyntax, die sich mir entzieht.

14voto

chqrlie Punkte 110208

Es gibt zwei Möglichkeiten, Ihre Zahl mit führenden Nullen auszugeben:

Die Verwendung des 0 und der Breitenangabe:

int zipcode = 123;
printf("%05d\n", zipcode);  // Outputs 00123

Verwendung des Präzisionsbezeichners:

int zipcode = 123;
printf("%.5d\n", zipcode);  // Outputs 00123

Der Unterschied zwischen diesen beiden ist die Behandlung negativer Zahlen:

printf("%05d\n", -123);  // Outputs -0123 (pad to 5 characters)
printf("%.5d\n", -123);  // Outputs -00123 (pad to 5 digits)

Es ist unwahrscheinlich, dass die Postleitzahlen negativ sind, daher sollte dies keine Rolle spielen.

Beachten Sie jedoch, dass Postleitzahlen auch Buchstaben und Bindestriche enthalten können, weshalb sie als Zeichenketten gespeichert werden sollten. Die Einbeziehung der führenden Nullen in die Zeichenkette ist unkompliziert und löst Ihr Problem auf viel einfachere Weise.

Beachten Sie, dass in beiden obigen Beispielen die 5 Breiten- oder Präzisionswerte können als Parameter angegeben werden. int Argument:

int width = 5;
printf("%0*d\n", width, 123);  // Outputs 00123
printf("%.*d\n", width, 123);  // Outputs 00123

Es gibt noch einen weiteren Trick: eine Genauigkeit von 0 bewirkt keine Ausgabe für den Wert 0 :

printf("|%0d|%0d|\n", 0, 1);   // Outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1); // Outputs ||1|

6voto

Trent Punkte 12681

printf ermöglicht verschiedene Formatierungsoptionen.

Beispiel:

printf("leading zeros %05d", 123);

2voto

pro3carp3 Punkte 799

Sie ersparen sich (langfristig) einen Haufen Ärger, wenn Sie eine Postleitzahl als Zeichenkette speichern, was sie auch ist, und nicht als Zahl, was sie nicht ist.

0voto

rch Punkte 9

Mehr Flexibilität. Hier ein Beispiel für den Druck von rechtsbündigen Zahlenreihen mit fester Breite und Leerzeicheneinzug.

//---- Header
std::string getFmt ( int wid, long val )
{  
  char buf[64];
  sprintf ( buf, "% *ld", wid, val );
  return buf;
}
#define FMT (getFmt(8,x).c_str())

//---- Put to use
printf ( "      COUNT     USED     FREE\n" );
printf ( "A: %s %s %s\n", FMT(C[0]), FMT(U[0]), FMT(F[0]) );
printf ( "B: %s %s %s\n", FMT(C[1]), FMT(U[1]), FMT(F[1]) );
printf ( "C: %s %s %s\n", FMT(C[2]), FMT(U[2]), FMT(F[2]) );

//-------- Output
      COUNT     USED     FREE
A:      354   148523     3283
B: 54138259 12392759   200391
C:    91239     3281    61423

Die Funktion und das Makro sind so konzipiert, dass die printfs besser lesbar sind.

0voto

Brad Jennings Punkte 1

Wenn Sie die Postleitzahl in einem Zeichenfeld speichern müssen, zipcode[] können Sie dies verwenden:

snprintf(zipcode, 6, "%05.5d", atoi(zipcode));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X