Книга: Linux программирование в примерах

13.3.5. Перестановка порядка слов с помощью printf()

13.3.5. Перестановка порядка слов с помощью printf()

Иногда при переводах порядок слов, естественный для английского языка, не подходит в других языках. Например, на английском прилагательные идут перед определяемыми существительными, а на многих других языках — после. Таким образом, следующий код представляет проблему:

char *animal_color, *animal;
if (...) {
 animal_color = _("brown");
 animal = _("cat");
} else if (...) {
 ...
} else {
 ...
}
printf(_("the %s %s looks at you enquiringly.n"), animal_color, color);

Здесь форматирующая строка, animal_color и animal неудачно включены в вызов gettext(). Однако, после перевода утверждение будет неверным, поскольку порядок аргументов не может быть изменен во время исполнения.

Чтобы обойти это, версия семейства printf() POSIX (но не ISO С) допускает использовать в описателе формата указатель положения. Он принимает форму десятичного числа, за которым следует символ $, сразу после начального символа %. Например printf("%2$s, %1sn", "world", "hello");

Указатель положения обозначает аргумент из списка, который следует использовать, отсчет начинается с 1 и не включает саму форматирующую строку. Этот пример выводит знаменитое сообщение 'hello, world' в правильном порядке.

GLIBC и Solaris реализуют эту возможность. Поскольку это часть POSIX, если printf() вашего поставщика Unix не реализует ее, она вскоре должна появиться.

За указателем положения могут следовать любые обычные флаги printf(), указатели ширины полей и точности. Вот правила для использования указателей положения:

• Форма с указателем положения не может смешиваться с формой без нее. Другими словами, или каждый указатель формата включает указатель положения, или ни один его не включает. Конечно, %% может использоваться всегда.

• Если в форматирующей строке используется N-й аргумент, в этой строке должны использоваться также все аргументы до N. Соответственно, следующее неверно printf("%3$s %1$sn", "hello", "cruel", "world");

• Ссылка на определенный аргумент может быть сделана указателем положения несколько раз. Не позиционные спецификаторы формата всегда движутся через список аргументов последовательно.

Эта возможность не предназначена для непосредственного использования программистами приложений, она скорее для переводчиков. Например, перевод предыдущей форматирующей строки, "The %s %s looks at you enquiringly.n", на французский мог бы быть:

"Le %2$s %1$s te regarde d'un aire interrogateur.n"

(Даже этот перевод не совершенен: артикль «Le» имеет род. Подготовка программы к переводу трудная задача!)

Оглавление книги


Генерация: 1.204. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз