Jak formatować ciągi za pomocą printf (), aby uzyskać taką samą długość w wyjściu

Mam dwie funkcje, jedną, która wytwarza komunikaty typu Starting initialization... i drugą, która sprawdza kody zwrotne i wyjścia "Ok", "Warning" lub "Error". Jednak wyjście, które jest produkowane jest różnej długości:

Starting initialization...Ok.
Checking init scripts...Ok.

Jak mogę dostać coś takiego jak poniżej?

Starting initialization...       Ok.
Checking init scripts...         Ok.
Author: Peter Mortensen, 2009-11-27

6 answers

Można określić szerokość pól łańcuchowych, np.

printf("%-20s", "initialization...");

I wtedy cokolwiek jest wydrukowane z tym polem będzie puste-wyściełane do wskazanej szerokości.

- Lewy-uzasadnia Twój tekst w tym polu.

 168
Author: Carl Smotricz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 14:00:23

printf umożliwia formatowanie ze specyfikacjami szerokości. Na przykład,

printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Aby wskazać uzasadnienie w lewo, należy użyć określenia ujemnej szerokości, ponieważ domyślnym ustawieniem jest justowanie w prawo.

 25
Author: PP.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 14:01:32

Dodatkowo, jeśli chcesz mieć elastyczność wyboru width, możesz wybrać jeden z następujących dwóch formatów (z obcinaniem lub bez):

int width = 30;
// No truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// Output is "Starting initialization...     Ok."

// Truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." );
// Output is "Starting initialization... Ok."
 20
Author: lifebalance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 14:09:39

Istnieje również modyfikator %n, który może pomóc w pewnych okolicznościach. Zwraca kolumnę, na której do tej pory znajdował się łańcuch znaków. Przykład: chcesz napisać kilka wierszy, które znajdują się w szerokości pierwszego wiersza, jak tabela.

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

Wydrukuje dwie kolumny o tej samej szerokości, niezależnie od długości, jaką mogą mieć dwa ciągi header1 i header2. Nie wiem, czy wszystkie implementacje mają %n, ale Solaris i Linux tak.

 13
Author: Patrick Schlüter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 14:05:50

Istnieje również dość zaawansowane technologicznie rozwiązanie polegające na ręcznym liczeniu spacji, aby Twoje wiadomości wyrównały się. Nic nie stoi na przeszkodzie, aby włączyć kilka końcowych spacji w ciągach wiadomości.

 0
Author: Carl Smotricz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-27 15:44:15

Zacznij od użycia tabulatorów - modyfikatora znaków \t . Przesunie się do stałej lokalizacji (kolumny, terminalowy żargon).

Jednak nie pomaga, jeśli są różnice większe niż szerokość kolumny (4 znaki, o ile dobrze pamiętam).

Aby to naprawić, napisz swoje "OK/NOK" rzeczy za pomocą stałej liczby kart (5? 6?, spróbuj). Następnie return (\R) bez new-lining i napisz swoją wiadomość.

 -2
Author: jpinto3912,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-07 14:02:48