Ausrichten von Spalten in der printf-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Notation %{integer}d, um die Ausgabe in C auszurichten
  2. Verwenden der %*d-Notation zum Ausrichten der Ausgabe in C
  3. Verwenden der Notationen %*d und %{int}d zum Ausrichten von Spalten in der Tabelle
Ausrichten von Spalten in der printf-Funktion in C

Dieser Artikel demonstriert mehrere Methoden zum Ausrichten von Spalten in der Funktion printf in C.

Verwenden Sie die Notation %{integer}d, um die Ausgabe in C auszurichten

Die Funktion printf ist Teil der Standard-E/A-Bibliothek und kann verwendet werden, um eine formatierte Zeichenkette in den Stream stdout auszugeben. Der stdout-Stream ist gepuffert; daher kann es zu Verzögerungen kommen, wenn die Zeichenkette kein Zeilenumbruchzeichen enthält. Normalerweise wird die angegebene Zeichenkette erst gedruckt, wenn der interne Puffer nicht gefüllt ist; erst dann wird der Inhalt in den stdout-Stream geschrieben.

printf verwendet Formatspezifikationen, die mit dem Zeichen % beginnen, um die Formatierung der Zeichenkette zu steuern. Zusätzlich zu den verschiedenen Spezifizierern für eingebaute Datentypen können einige Symbole verschiedene Eigenschaften wie Ausrichtung und Auffüllen hinzufügen. In diesem Fall fügen wir die angegebene Ganzzahl zwischen dem %-Zeichen und dem Format-Spezifizierer ein, um die Anzahl der Leerzeichen anzugeben, die auf der linken Seite des Ausgabeelements aufgefüllt werden sollen. Folglich können wir die gleiche Zahl für mehrere Zeilenausgaben einfügen, um die Einträge rechts auszurichten.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%10d %d\n", mm1, mm1);
  printf("%10d %d\n", mm2, mm2);
  printf("%10d %d\n", mm3, mm3);

  exit(EXIT_SUCCESS);
}

Ausgabe:

11011 11011
  111 111
   11 11

Verwenden der %*d-Notation zum Ausrichten der Ausgabe in C

Alternativ kann dieselbe Formatierung auch mit der %*d-Notation erreicht werden, die zusätzlich erfordert, dass die Ganzzahl wie Datenargumente geliefert wird - nach dem Komma. Beachten Sie jedoch, dass, wenn mehrere Formatierungsangaben das %-Zeichen enthalten, sie alle einen separaten Integer-Wert vor dem entsprechenden Argument enthalten müssen.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%*d %d\n", 10, mm1, mm1);
  printf("%*d %d\n", 10, mm2, mm2);
  printf("%*d %d\n\n", 10, mm3, mm3);

  exit(EXIT_SUCCESS);
}

Ausgabe:

11011 11011
  111 111
   11 11

Verwenden der Notationen %*d und %{int}d zum Ausrichten von Spalten in der Tabelle

Schließlich können wir beide Methoden in verschiedenen Szenarien kombinieren und Spalten in jeder textuellen Tabellenausgabe ausrichten. Beachten Sie, dass es manchmal erforderlich ist, dass die Spalteneinträge linksbündig ausgerichtet werden. Wir können dies erreichen, indem wir negative ganzzahlige Werte zwischen die Formatangaben einfügen oder sie als Argumente mit der %*d-Notation übergeben. Die letztere Lösung ist besser geeignet, wenn das Padding nicht als konstant bekannt ist und zur Laufzeit dynamisch berechnet werden kann.

#include <stdio.h>
#include <stdlib.h>

#ifndef MAX
#define MAX 10
#endif

int main(int argc, char const *argv[]) {
  char *row1[] = {"num", "name", "sum"};
  int col1[] = {1, 2, 3};
  char *col2[] = {"one", "two", "three"};
  int col3[] = {1243, 14234, 3324};

  printf("%*s | %*s | %*s\n", -3, row1[0], -MAX, row1[1], MAX, row1[2]);
  printf("%*c | %*c | %*c\n", -3, '-', -MAX, '-', MAX, '-');
  size_t len = sizeof col1 / sizeof col1[0];
  for (int i = 0; i < len; ++i) {
    printf("%-3d | %-10s | %10d\n", col1[i], col2[i], col3[i]);
  }

  exit(EXIT_SUCCESS);
}

Ausgabe:

num | name       |        sum
-   | -          |          -
1   | one        |       1243
2   | two        |      14234
3   | three      |       3324
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C IO