2014-11-21 4 views
1

Этот следующий код:Как PRINTF выход фиксированной длины из формата

printf("%d. %-10s:", 1, "Test"); 

производит этот выход:

1. Test  :// 14 characters long 

Я хотел бы длину вывода всего формата `% D. % -10s:»быть ровно 10 символов, как это:

1. Test: // 10 characters 

Примечание:

Номера различаются по длине, это может быть 1 или 100, так что я не могу вывести его длина от .? выход

Как я могу это сделать

+0

Не должно быть "Абдул Раззак"? – haccks

+4

Два шага: 'snprintf()' to create '" 1. Тест: "', а затем 'printf ("% - * s ", 10, buffer);' где у вас есть 'char buffer [20];' и отформатируйте значение в нем с помощью 'snprintf()'. –

+0

@JonathanLeffler не может быть достигнуто только с помощью «printf»? – razzak

ответ

3

Вы должны использовать два шага:

char buffer[20]; 
snprintf(buffer, sizeof(buffer), "%d. %s:", 1, "Test"); 
printf("%-*s", 10, buffer); 

Операция snprintf() дает вам строку 1. Test: в buffer; обратите внимание, что он включает в себя вывод : и не принимает никаких завершающих пробелов в строке "Test"). Операция printf() форматирует строку влево (-) длиной (по крайней мере) 10 (* в формате и 10 в списке аргументов) на стандартный вывод. Предположительно, после этого выхода в той же строке появится другое. в противном случае нет очевидного смысла в пустом заполнении.

Для получения полной информации см:

Это охватывает основные операции *printf() семейства функций (но не перечисляет интерфейсы к v*printf() или *wprintf() семейств функций) ,

Код в вопросе и в ответе выше делается с константами. Более реалистичный сценарий будет:

void format_item(int number, const char *text, int width) 
{ 
    char buffer[width+1]; // C99 VLA 
    snprintf(buffer, sizeof(buffer), "%d. %s:", number, text); 
    printf("%-*s", width, buffer); 
} 

Обратите внимание, что этот код обрезает отформатированные данные, если число плюс строка слишком длинная. Есть способы обойти это, если вы работаете немного сложнее (например, добавьте более 1 в width в определение buffer - возможно, добавьте 15 вместо 1).

Вы могли бы написать:

format_item(1, "Test", 10); 

или:

char *str_var = …some function call, perhaps… 
int item = 56; 
format_item(++item, str_var, 20); 

т.д.

Смежные вопросы