plus - sprintf pro c
sprintf() sin espacio nulo al final en C (7)
¿Hay alguna manera de utilizar la función C sprintf () sin que agregue un carácter ''/ 0'' al final de su salida? Necesito escribir texto formateado en el medio de una cadena de ancho fijo.
sprintf devuelve la longitud de la cadena escrita (sin incluir el terminal nulo), puede usar eso para saber dónde estaba el terminal nulo, y cambiar el carácter de terminal nulo a otra cosa (es decir, un espacio). Eso sería más eficiente que usar strncpy.
unsigned int len = sprintf(str, ...);
str[len] = ''<your char here>'';
No hay forma de decirle a sprintf()
no escriba un nulo final. Lo que puede hacer es usar sprintf()
para escribir en una cadena temporal, y luego algo como strncpy()
para copiar solo los bytes que desee.
También podría usar su cadena de ancho fijo como una cadena de formato como esta:
char my_fixed_width_string_format[] = "need 10 chars starting here: %10s";
char my_fixed_width_string[40];
char string_to_print[] = "abcdefghijklmnop";
sprintf(my_fixed_width_string, my_fixed_width_string_format, string_to_print;
printf(my_fixed_width_string);
debería ceder
necesita 10 caracteres comenzando aquí: abcdefghij
No puede hacer esto con sprintf (), pero puede hacerlo con snprintf (), dependiendo de su plataforma.
Necesitas saber cuántos personajes estás reemplazando (pero como los estás poniendo en el medio de una cadena, probablemente lo sepas de todos modos).
Esto funciona porque algunas implementaciones de snprintf () NO garantizan que se escriba un carácter de terminación, presumiblemente por compatibilidad con funciones como stncpy ().
char message[32] = "Hello 123, it''s good to see you.";
snprintf(&message[6],3,"Joe");
Después de esto, "123" se reemplaza con "Joe".
En las implementaciones donde snprintf () garantiza la terminación nula incluso si la cadena se trunca, esto no funcionará. Entonces, si la portabilidad del código es una preocupación, debe evitar esto.
La mayoría de las versiones de snprintf () basadas en Windows exhiben este comportamiento.
Pero, MacOS y BSD (y tal vez Linux) parecen tener una terminación nula.
mira aquí: http://en.wikipedia.org/wiki/Printf
printf ("%. * s", 3, "abcdef") dará como resultado la impresión de "abc"
Como está escribiendo en un área fija, puede hacerlo así:
// pointer to fixed area we want to write to
char* s;
// number of bytes needed, not including the null
int r = snprintf(0, 0, <your va_args here>);
// char following the last char we will write - null goes here
char c = s[r + 1];
// do the formatted write
snprintf(s, r + 1, <your_va_args here>);
// replace what was overwritten
s[r + 1] = c;
En realidad, este ejemplo no agregará un valor nulo si usa snprintf:
char name[9] = "QQ40dude";
unsigned int i0To100 = 63;
_snprintf(&name[2],2,"%d",i0To100);
printf(name);// output will be: QQ63dude