На днях я оказался в ситуации, когда %n
хорошо решит мою проблему.В отличие от моего предыдущего ответа , в этом случае я не могу придумать хорошую альтернативу.
У меня есть элемент управления с графическим интерфейсом, который отображает некоторый указанный текст.Этот элемент управления может отображать часть этого текста жирным шрифтом (или курсивом, или подчеркнутым, и т. Д.), И я могу указать, какую часть, указав начальный и конечный индексы символов.
В моем случае я генерируютекст для элемента управления с snprintf
, и я хотел бы, чтобы одна из замен была выделена жирным шрифтом.Поиск начального и конечного индексов для этой замены нетривиален, потому что:
Строка содержит несколько подстановок, и одна из подстановок является произвольным, заданным пользователем текстом.Это означает, что выполнение текстового поиска подстановки, о которой я забочусь, потенциально неоднозначно.
Строка формата может быть локализована и может использовать расширение $
POSIX для спецификаторов позиционного формата,Поэтому поиск в исходной строке формата самих спецификаторов формата нетривиален.
Аспект локализации также означает, что я не могу легко разбить строку формата на несколько вызовов snprintf
.
Поэтому самый простой способ найти индексы вокруг конкретной замены - сделать:
char buf[256];
int start;
int end;
snprintf(buf, sizeof buf,
"blah blah %s %f yada yada %n%s%n yakety yak",
someUserSpecifiedString,
someFloat,
&start, boldString, &end);
control->set_text(buf);
control->set_bold(start, end);