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.
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.
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.
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."
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.
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.
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ść.
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