Por ejemplo, si almaceno ABCDE desde la función scanf, la última función printf me da ABCDE como salida. Entonces, ¿cuál es el punto de asignar el tamaño de la cadena (Aquí 4).
#include <stdio.h> int main() { int c[4]; printf("Enter your name:"); scanf("%s",c); printf("Your Name is:%s",c); return 0; }¡Comenzaré con, no use la matriz int para almacenar cadenas!
int c[4] asigna una matriz de 4 enteros. Un int suele ser de 4 bytes, por lo que normalmente sería de 16 bytes (pero podría ser de 8 o 32 o algo más en algunas plataformas).
Luego, usa esta asignación primero para leer caracteres con scanf . Si ingresa ABCDE , usa 6 caracteres (hay un 0 byte adicional al final de la cadena que marca el final, que también necesita espacio), que encaja en la memoria reservada para una matriz de 4 enteros. Ahora podría tener mucha mala suerte y tener una plataforma en la que int tiene la llamada "representación trampa", lo que haría que su programa fallara. Pero, si no está escribiendo el código para algún dispositivo muy exótico, no lo habrá. Ahora sucede que este código va a funcionar, por la misma razón que va a funcionar memcpy : el tipo char es especial en C y permite copiar bytes hacia y desde diferentes tipos.
El mismo tratamiento especial ocurre cuando imprime la matriz int[4] con printf usando el formato %s . Funciona, porque el char es especial.
Esto también demuestra cuán inseguros son scanf e printf . Con gusto aceptan c que les das y asumen que es una matriz de caracteres con tamaño y datos válidos.
Pero, no hagas esto. Si desea almacenar una cadena, char la matriz de caracteres. El código correcto para esto sería:
#include <stdio.h> int main() { char c[16]; // fits 15 characters plus terminating 0 printf("Enter your name:"); int items = scanf("%15s",c); // note: added maximum characters // scanf returns number of items read successfully, *always* check that! if (items != 1) { return 1; // exit with error, maybe add printing error message } printf("Your Name is: %s\n",c); // note added newline, just as an example return 0; }El tamaño de una matriz debe definirse al declarar una variable de cadena C porque se usa para calcular cuántos caracteres se almacenarán dentro de la variable de cadena y, por lo tanto, cuánta memoria se reservará para su cadena. Si excede esa cantidad, el resultado es un comportamiento indefinido.
Has usado int c , no char c . En C, un char tiene solo 1 byte de longitud, mientras que un int tiene 4 bytes. Es por eso que no enfrentaste ningún problema.