Suponga que tiene una cadena que NO está nullterminada y conoce su tamaño exacto, entonces, ¿cómo puede imprimir esa cadena printfen C? Recuerdo tal método pero no puedo averiguarlo ahora ...
Suponga que tiene una cadena que NO está nullterminada y conoce su tamaño exacto, entonces, ¿cómo puede imprimir esa cadena printfen C? Recuerdo tal método pero no puedo averiguarlo ahora ...
Respuestas:
Existe una posibilidad con printf, es así:
printf("%.*s", stringLength, pointerToString);
No es necesario copiar nada, no es necesario modificar la cadena o el búfer original.
printfincluso después de una ~ década ... :)
printf, imprimirá hasta 11 caracteres o hasta que encuentre NULL, lo que ocurra primero; en su ejemplo, NULL viene primero. Especificar una longitud máxima no hace que NULL pierda su significado de "fin de cadena" para printf.
Aquí hay una explicación de cómo %.*sfunciona y dónde se especifica.
Las especificaciones de conversión en una cadena de plantilla printf tienen la forma general:
% [ param-no $] flags width [ . precision ] type conversiono
% [ param-no $] flags width . * [ param-no $] type conversion
La segunda forma es para obtener la precisión de la lista de argumentos:
También puede especificar una precisión de '*'. Esto significa que el siguiente argumento en la lista de argumentos (antes del valor real que se imprimirá) se utiliza como precisión. El valor debe ser un int y se ignora si es negativo.
- Sintaxis de conversión de salida en el manual de glibc
Para el %sformato de cadenas, la precisión tiene un significado especial:
Se puede especificar una precisión para indicar el número máximo de caracteres a escribir; de lo contrario, los caracteres de la cadena hasta pero sin incluir el carácter nulo de terminación se escriben en el flujo de salida.
- Otras conversiones de salida en el manual de glibc
Otras variantes útiles:
"%*.*s", maxlen, maxlen, val justificará a la derecha, insertando espacios antes;"%-*.*s", maxlen, maxlen, val justificará a la izquierda."%-*.*s", padding, str_view.size(), str_view.data()
¡Puede usar un fwrite () para stdout!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
De esta manera, generará los primeros caracteres (número definido en la variable number_of_chars) a un archivo, en este caso a stdout (la salida estándar, su pantalla).
printf("%.*s", length, string) no trabajará.
Esto significa imprimir HASTA bytes de longitud O un byte nulo, lo que ocurra primero. Si su matriz de caracteres no terminada en nulo contiene bytes nulos ANTES de la longitud, printf se detendrá en ellos y no continuará.
#include<string.h>
int main()
{
/*suppose a string str which is not null terminated and n is its length*/
int i;
for(i=0;i<n;i++)
{
printf("%c",str[i]);
}
return 0;
}
Edité el código, aquí hay otra forma:
#include<stdio.h>
int main()
{
printf ("%.5s","fahaduddin");/*if 5 is the number of bytes to be printed and fahaduddin is the string.*/
return 0;
}
Ccontexto, todas las cadenas terminan en nulo. Las matrices de char sin un nulo en ellas no son cadenas ... son matrices de char :)