tag - ¿Cómo imprimo una cadena que no termina en nulo usando printf?
tag del amor preguntas (2)
¿Cómo puedo imprimir una cadena no terminada en nulo usando printf, asumiendo que conozco la longitud de la cadena en tiempo de ejecución?
La respuesta proporcionada por @KennyTM es genial, pero con una sutileza.
En general, si la cadena no es nula está "terminada", pero tiene un carácter nulo en el medio, printf("%.*s", length, string);
No funciona como se esperaba. Esto se debe a que la cadena de formato %.*s
le pide a printf
que imprima un máximo de caracteres de length
, no exactamente caracteres de length
.
Prefiero usar la solución más general señalada por @William Pursell en un comentario en el marco del OP:
fwrite(string, sizeof(char), length, stdout);
Aquí hay un código de ejemplo:
#include <stdio.h>
int main(void) {
size_t length = 5;
char string[length];
string[0] = ''A'';
string[1] = ''B'';
string[2] = 0; // null character in the middle
string[3] = ''C'';
string[4] = ''D'';
printf("With printf: %.*s/n", length, string);
printf("With fwrite: ");
fwrite(string, sizeof(char), length, stdout);
printf("/n");
return 0;
}
Salida:
With printf: AB
With fwrite: AB CD
printf("%.*s", length, string);
Utilice junto con otros argumentos:
printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
// ^^^^ ^^^^^^^^^^^^^^
En C, puede especificar la longitud máxima para la salida con el formato %.123s
. Esto significa que la longitud de salida es a lo sumo de 123 caracteres. El 123
podría reemplazarse por *
, de modo que la longitud se tomará del argumento de printf en lugar de codificado.
Tenga en cuenta que esto supone que la string
no contiene ningún bytes nulos interiores (/ 0), ya que %.123s
solo limita la longitud máxima, no la longitud exacta , y las cadenas aún se tratan como terminadas en nulo.
Si desea imprimir una cadena no terminada en nulo con un valor nulo interior, no puede usar un solo printf. Utilice fwrite
lugar:
fwrite(string, 1, length, stdout);
Vea la respuesta de @ MSDousti para una explicación detallada.