Днями я опинився в ситуації, коли %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);