printf() \t Option

Lesezeit: 3 Minuten

Benutzer-Avatar
liv2hak

Wenn Sie ein Tabulatorzeichen auf der Standardausgabe mit ausgeben printf in C gibt es ein Leerzeichen aus, das anscheinend 4 Zeichen lang ist.

printf("\t");

Gibt es eine Möglichkeit, die Tabulatorbreite im obigen Fall zu steuern?

Benutzer-Avatar
Cnicutar

Das wird von Ihrem Terminal gesteuert, nicht von printf.

printf schickt einfach a \t zum Ausgabestrom (der ein tty, eine Datei usw. sein kann). Es sendet keine Leerzeichen.

Benutzer-Avatar
Sander DeDycker

Ein Tab ist ein Tab. Wie viele Leerzeichen es verbraucht, ist ein Anzeigeproblem und hängt von den Einstellungen Ihrer Shell ab.

Wenn Sie die Breite Ihrer Daten steuern möchten, können Sie die verwenden Breite Unterspezifizierer in der printf Zeichenfolge formatieren. Zum Beispiel,

printf("%5d", 2);

Es ist keine vollständige Lösung (wenn der Wert länger als fünf Zeichen ist, wird er nicht abgeschnitten), aber es könnte für Ihre Anforderungen in Ordnung sein.

Wenn Sie die vollständige Kontrolle wünschen, müssen Sie sie wahrscheinlich selbst implementieren.

  • Tatsächlich können Sie für Zeichenfolgen eine Kürzung erhalten: printf("%5.5s","abcdefg"); gibt “abcde” aus. Und wenn Sie möchten, dass die Ausgabe immer linksbündig ist, wenn die Zeichenfolge weniger als 5 Zeichen lang ist, verwenden Sie "%-5.5s"

    – proFromDover

    11. Juli 2011 um 9:53 Uhr

  • @proFromDover: Wenn Sie sich auf Zeichenfolgen beschränken können, ist das in Ordnung, ja.

    – Sander DeDycker

    11. Juli 2011 um 10:22 Uhr

Benutzer-Avatar
KamilCuk

Wenn dein Terminal unterstützt richtig ANSI-Escape-Sequenzenmüssen Escape-Sequenzen gesetzt werden Tabstopps an eine beliebige Stelle auf dem Bildschirm. Die Fluchtsequenz ESC [ 3 g clears all tab stops, the escape sequence ESC H sets the tab stop at a specific location.

Below is an POSIX example C program that provides a function that set’s tab stops to the specified count of spaces. First all existing tabs are removed, then spaces are printed and in proper locations the tab stop is set. Then the cursor is rewind back to the start of the line.

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <termios.h>

int writestr(int fd, const char *s) {
    return write(fd, s, strlen(s)) == (ssize_t)strlen(s) ? 0 : -1;
}

int set_tab_stops(unsigned distance) {
    assert(distance > 0);
    // Using stdout here, stderr would be more reliable. 
    FILE *file = stdout;
    const int fd = fileno(file);
    // We have to flush stdout in order to use fileno.
    fflush(file);
    // Get terminal width.
    // https://stackoverflow.com/questions/1022957/getting-terminal-width-in-c
    struct winsize w = {0};
    if (ioctl(fd, TIOCGWINSZ, &w) < 0) return -__LINE__;
    const unsigned cols = w.ws_col;
    // Remove all current tab stops.
    if (writestr(fd, "\033[3g") < 0) return -__LINE__;
    // Do horicontal tabs each distance spaces.
    for (unsigned i = 0; i < cols; ++i) {
        if (i % distance == distance - 1) {
            if (writestr(fd, "\033H") < 0) return -__LINE__;
        }
        if (writestr(fd, " ") < 0) return -__LINE__;
    }
    // Clear the line and return to beginning of the line.
    if (writestr(fd, "\033[1K\033[G") < 0) return -__LINE__;
    return 0;
}

int main() {
    set_tab_stops(10);
    printf("1\t2\t3\t4\n");
    set_tab_stops(5);
    printf("1\t2\t3\t4\n");
}

With xfce4-terminal the program outputs:

1        2         3         4
1   2    3    4

1369910cookie-checkprintf() \t Option

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy