Por tanto *printf
y *scanf
, %s
espera que el argumento correspondiente sea de tipo char *
, y por scanf
, más vale que apuntan a un búfer grabable (es decir, no un literal de cadena).
char *str_constant = "I point to a string literal";
char str_buf[] = "I am an array of char initialized with a string literal";
printf("string literal = %s\n", "I am a string literal");
printf("str_constant = %s\n", str_constant);
printf("str_buf = %s\n", str_buf);
scanf("%55s", str_buf);
Usando %s
en scanf
sin un ancho de campo explcit abre la misma desbordamiento del búfer que gets
hicieron; es decir, si hay más caracteres en la secuencia de entrada de los que el búfer de destino tiene el tamaño para contener, scanf
felizmente escribirá esos caracteres adicionales en la memoria fuera del búfer, lo que podría significar algo importante. Desafortunadamente, a diferencia de printf
, puede no proporciona el campo con un argumento como el tiempo de ejecución:
printf("%*s\n", field_width, string);
Una opción es construir la cadena de formato de forma dinámica:
char fmt[10];
sprintf(fmt, "%%%lus", (unsigned long) (sizeof str_buf) - 1);
...
scanf(fmt, target_buffer); // fmt = "%55s"
EDITAR
El uso de scanf
con el especificador de conversión %s
detendrá el escaneo en el primer carácter de espacio en blanco; por ejemplo, si su flujo de entrada parece
"This is a test"
continuación scanf("%55s", str_buf)
leerán y asignar "This"
-str_buf
. Tenga en cuenta que el campo con especificador no hace una diferencia en este caso.
¿Has buscado en Google? Lee cualquier libro de texto? ¿Intentó algún código? – abelenky
posible duplicado de [¿Cómo imprimo una cadena no terminada en nulo usando printf?] (Http://stackoverflow.com/questions/2137779/how-do-i-print-a-non-null-terminated-string -using-printf) –
@nofe '% c' es para un solo carácter, mientras que'% s' corresponde a una serie de caracteres terminados en nulo. ¿Qué específicamente no entendiste? – Mahesh