2010-01-26 12 views
48

¿Cómo puedo imprimir una cadena no terminada en nulo usando printf, suponiendo que sé la longitud de la cadena en tiempo de ejecución?¿Cómo imprimo una cadena no terminada en nulo usando printf?

+3

¿Por qué no utilizar fwrite? –

+4

Si no es nulo terminado, entonces, por definición, no es una cadena. –

+3

no es solo una _c cadena_, ya que sería una cadena válida en otros idiomas ... y aunque una "matriz de caracteres no terminados en nulo" sería más precisa, estoy bastante seguro de que fue universalmente entendida. – Willdorf

Respuesta

81
printf("%.*s", length, string); 

uso junto con otros argumentos:

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number); 
//       ^^^^      ^^^^^^^^^^^^^^ 

En C se podría especificar la longitud máxima de salida con el formato %.123s. Esto significa que la longitud de salida es como máximo 123 caracteres. El 123 podría reemplazarse por *, de modo que la longitud se tomará del argumento de printf en lugar de hard-coded.

Tenga en cuenta que esto supone la string no contiene caracteres nulos interiores (\ 0), ya que sólo se limita %.123s la longitud máxima no la longitud exacta y cadenas siguen siendo tratadas como terminada en nulo.

Si desea imprimir una cadena no terminada en nulo con nulo interior, no puede usar una sola impresiónf. fwrite utilizar en su lugar:

fwrite(string, 1, length, stdout); 

Ver @M.S.Dousti's answer para una explicación detallada.

+0

Gracias por la respuesta rápida ! – Mike

+5

nota: 'length' debe tener el tipo' int' aquí, después de las promociones predeterminadas de los argumentos. Si su variable 'length' es algo más grande (por ejemplo' size_t') debería convertirla a '(int)' de lo contrario su código se romperá en una plataforma donde 'size_t' es más ancho que' int'. –

13

La respuesta proporcionada por @KennyTM es genial, pero con una sutileza.

En general, si la cadena no es nula "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 pregunta printf para imprimir un máximo de length caracteres, no exactamentelength caracteres.

Prefiero utilizar la solución más general señalado por @William Pursell en un comentario debajo de la OP:

fwrite(string, sizeof(char), length, stdout); 

Aquí está un ejemplo de código:

#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 
+1

'sizeof (char)' es 1 por definición. Además, 'NULL' es específicamente una constante null * puntero *. –

+0

@KeithThompson, 'sizeof (char)' es más semántico. Además, ''\ 0'' es más semántico que' 0'. Pero a quién le importa ;-) –

Cuestiones relacionadas