¿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?
Respuesta
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.
Gracias por la respuesta rápida ! – Mike
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'. –
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
'sizeof (char)' es 1 por definición. Además, 'NULL' es específicamente una constante null * puntero *. –
@KeithThompson, 'sizeof (char)' es más semántico. Además, ''\ 0'' es más semántico que' 0'. Pero a quién le importa ;-) –
- 1. Cadena terminada en nulo
- 2. ¿Qué es una cadena terminada en nulo?
- 3. Lectura de una cadena terminada en nulo
- 4. Uso de printf con una cadena terminada no nula
- 5. strlen() en cadena de caracteres no terminada en nulo?
- 6. ¿Cómo imprimo el carácter '%' con 'printf'?
- 7. ¿std :: string :: c_str() siempre devuelve una cadena terminada en nulo?
- 8. ¿Cómo obtener una cadena terminada nula de una cadena C#?
- 9. Obtención de cadena terminada en nulo desde System.Text.Encoding.Unicode.GetString
- 10. Cadena terminada en cero doble
- 11. ¿Hay un equivalente strtol que no requiera una cadena terminada en nulo?
- 12. ¿Cómo puedo convertir una cadena terminada en nulo en un buffer de byte a una cadena en Go? Este
- 13. ¿Por qué cadenas terminadas en nulo? O: terminada en nulo vs almacenamiento de caracteres + longitud
- 14. WinDbg y SoS, ¿cómo imprimo/vuelco una cadena grande?
- 15. Cómo imprimir una cadena terminada en nulo con líneas nuevas sin mostrar escapes de barra invertida en gdb?
- 16. ¿Cómo agrego una nueva línea usando printf?
- 17. ¿Cómo imprimo un bit?
- 18. ¿cómo imprimo una lista en haskell?
- 19. /bin/sh: Error de sintaxis: cadena entrecomillada no terminada
- 20. F # printf cadena
- 21. ¿Cómo imprimo una matriz multidimensional en ruby?
- 22. ¿Cómo imprimo una matriz Java en gdb?
- 23. ¿Cómo comprobar una cadena contra nulo en Java?
- 24. Inconsistencia usando printf
- 25. copia no terminada en nulo matriz de caracteres sin signo a std :: string
- 26. Usando awk printf para urldecode texto
- 27. ¿Cómo imprimo CFStringRef en una acción de DTrace?
- 28. cómo almacenar printf en una variable?
- 29. printf usando la pila?
- 30. ¿Tengo una ranura terminada si comienzo QProcess usando startDetached
¿Por qué no utilizar fwrite? –
Si no es nulo terminado, entonces, por definición, no es una cadena. –
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