El otro día me encontré en una situación en la %n
que resolvería muy bien mi problema. A diferencia de mi respuesta anterior , en este caso, no puedo idear una buena alternativa.
Tengo un control GUI que muestra un texto específico. Este control puede mostrar parte de ese texto en negrita (o en cursiva, o subrayado, etc.), y puedo especificar qué parte especificando índices de caracteres iniciales y finales.
En mi caso, estoy generando el texto para el control snprintf
, y me gustaría que una de las sustituciones se ponga en negrita. Encontrar los índices iniciales y finales de esta sustitución no es trivial porque:
La cadena contiene múltiples sustituciones, y una de las sustituciones es texto arbitrario especificado por el usuario. Esto significa que hacer una búsqueda textual de la sustitución que me interesa es potencialmente ambigua.
La cadena de formato puede estar localizada y puede usar la $
extensión POSIX para los especificadores de formato posicional. Por lo tanto, buscar en la cadena de formato original los propios especificadores de formato no es trivial.
El aspecto de localización también significa que no puedo dividir fácilmente la cadena de formato en varias llamadas a snprintf
.
Por lo tanto, la forma más sencilla de encontrar los índices en torno a una sustitución particular sería hacer:
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);