¿Se pueden considerar todas las cadenas como una matriz de caracteres ( Sí ), se pueden considerar todas las matrices de caracteres como cadenas ( No ).
¿Por qué no? y ¿por qué importa?
Además de las otras respuestas que explican que la longitud de una cadena no se almacena en ninguna parte como parte de la cadena y las referencias al estándar donde se define una cadena, la otra cara es "¿Cómo manejan las cadenas las funciones de la biblioteca de C?"
Si bien una matriz de caracteres puede contener los mismos caracteres, es simplemente una matriz de caracteres a menos que el último carácter sea seguido por el carácter de terminación nula . Ese carácter de terminación nula es lo que permite que la matriz de caracteres se considere (se maneje como) una cadena.
Todas las funciones en C que esperan una cadena como argumento esperan que la secuencia de caracteres sea terminada en nulo . ¿Por qué?
Tiene que ver con la forma en que funcionan todas las funciones de cadena. Como la longitud no se incluye como parte de una matriz, las funciones de cadena, escanee hacia adelante en la matriz hasta que se encuentre el carácter nulo (por ejemplo '\0'
, equivalente a decimal 0
). Ver tabla y descripción ASCII . Independientemente de si está utilizando strcpy
, strchr
, strcspn
, etc .. Todas las funciones de cadena se basan en el nulo de terminación de carácter estar presente para definir dónde el final de esa cadena es.
Una comparación de dos funciones similares de string.h
enfatizará la importancia del carácter de terminación nula . Toma por ejemplo:
char *strcpy(char *dest, const char *src);
La strcpy
función simplemente copia bytes desde src
hasta dest
hasta que se encuentra el carácter de terminación nula que indica strcpy
dónde detener la copia de caracteres. Ahora tome la función similar memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
La función realiza una operación similar, pero no considera ni requiere que el src
parámetro sea una cadena. Como memcpy
no puede simplemente avanzar en la src
copia de bytes dest
hasta que se alcanza un carácter de terminación nula , se requiere un número explícito de bytes para copiar como tercer parámetro. Este tercer parámetro proporciona memcpy
la misma información de tamaño que strcpy
puede derivarse simplemente escaneando hacia adelante hasta que se encuentre un carácter de terminación nula .
(que también enfatiza lo que sale mal strcpy
(o cualquier función que espera una cadena) si no proporciona la función con una cadena terminada en nulo; no tiene idea de dónde detenerse y felizmente correrá por el resto de su segmento de memoria la invocación de un comportamiento indefinido hasta que un nul caracteres sólo pasa a ser encontrado en algún lugar de la memoria - o se produce un fallo de segmentación)
Es por eso que las funciones que esperan una cadena terminada en nulo deben pasar una cadena terminada en nulo y por qué es importante .
char str[] = "hello";
caso.