ccs - strlen c
C-¿Por qué es necesario strcpy() (4)
El lenguaje C carece de una sintaxis conveniente para obtener un puntero a un literal de cadena junto con una indicación de su longitud. Algunos idiomas, incluidos muchos dialectos de Pascal, prefijan cada cadena con un byte que informa su longitud; esto funciona bien para muchos propósitos, pero limita los literales de cadena a 255 caracteres. El enfoque de C permite acomodar literales de cadena de cualquier longitud, pero agrega solo un byte de sobrecarga independientemente de la longitud.
Las cadenas terminadas en cero son inferiores a otras formas para casi cualquier propósito que no sean literales de cadena, pero los literales son la forma más común de cadena con la que muchos programas tendrán que lidiar, y por lo tanto hay una ventaja considerable de tener funciones de biblioteca tratar con ellos con eficacia; luego se vuelve más fácil usar cadenas terminadas en cero en los casos en que son menos ideales que tener un conjunto separado de rutinas de biblioteca para otros tipos.
¿Puede alguien explicarme por qué es necesario strcpy () para asignar cadenas a matrices de caracteres, como en el siguiente fragmento de código?
int main(void) {
char s[4];
s = "abc"; //Fails
strcpy(s, "abc"); //Succeeds
return 0;
}
¿Cuál es la razón por la que s = "abc"
falla? ¿Y por qué es strcpy () la única forma de asignar cadenas a matrices de caracteres una vez que se han declarado? Me parece extraño que tenga que usar una función para llevar a cabo una tarea básica.
Eso es simplemente lo que los arreglos están en C. No se les puede asignar. Puedes usar punteros si quieres:
char *p;
p = "abc";
Por cierto, hay una C FAQ .
Las matrices son "ciudadanos de segunda clase" en C; Un resultado de este prejuicio es que no se les puede asignar .
Las matrices en C son no asignables y no copiables inicializables. Así es como están los arreglos en C. Históricamente, en el contexto de valor (en el RHS de asignación), los arreglos decaen a los punteros, que es lo que impide formalmente la asignación y la inicialización de la copia. Esto se aplica a todas las matrices, no solo a matrices de caracteres.
El lenguaje C hereda el comportamiento de estos arreglos de sus predecesores: los lenguajes B y BCPL. En esos idiomas los arreglos estaban representados por punteros físicos. (Y, obviamente, la reasignación de punteros no es lo que querría que sucediera cuando asigna una matriz a otra). En el lenguaje C, las matrices no son punteros, pero sí "simulan" el comportamiento histórico de las matrices B y BCPL mediante la descomposición. a los punteros en la mayoría de los casos. Este legado histórico es lo que mantiene las matrices de C no copiables hasta el día de hoy.
Una excepción de lo anterior es la inicialización con un literal de cadena. Es decir que puedes hacer
char c[] = "abc";
Pero eso es todo.
Esto significa que siempre que desee copiar una matriz, debe usar una función de copia de memoria a nivel de biblioteca, como memcpy
. strcpy
es solo un sabor de eso específicamente diseñado para trabajar con cuerdas.
Respuesta corta: razones históricas. C nunca tuvo un tipo de cadena incorporado. No fue hasta que llegó C ++ que std :: string se creó, e incluso eso no llegó con las primeras implementaciones.
Respuesta larga: el tipo de "abc" no es char[]
, sino char *
. strcpy
es un mecanismo con el que puede copiar los datos a los que apunta el puntero (en este caso, es ABC).
strcpy
no es la única forma de inicializar una matriz, sin embargo, es lo suficientemente inteligente como para detectar y respetar el 0 que termina al final de la cadena. También puede usar memcpy
para copiar la cadena en s
pero eso requiere que pase la longitud de los datos a copiar, y para asegurarse de que el 0 (NULL) final esté presente en s