¿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.henfatizará la importancia del carácter de terminación nula . Toma por ejemplo:
char *strcpy(char *dest, const char *src);
La strcpyfunción simplemente copia bytes desde srchasta desthasta que se encuentra el carácter de terminación nula que indica strcpydó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 srcparámetro sea una cadena. Como memcpyno puede simplemente avanzar en la srccopia de bytes desthasta 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 memcpyla misma información de tamaño que strcpypuede 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.