strings - string c
El tipo de matriz char[] no es asignable (4)
Esta pregunta ya tiene una respuesta aquí:
- problemas con char array = char array 2 respuestas
Pues aquí está mi primer post. He estado tratando de elegir esta opción y quiero que el usuario elija solo números en lugar de escribirlos (más fácil), pero cuando quiero que los números sean iguales a una cadena, dice "array type char[30]
no es asignable ". Incluso si en la parte de atrás pongo el punto y coma o no.
#include <stdio.h>
int main() {
int choice1;
char word[30];
printf("You have three choice./n");
printf("[1] Jump [2] Run [3] Dance/n");
scanf("%d",&choice1);
if (choice1 == 1)
{
word = "Jump" //Error #1
}
else if (choice1 == 2)
{
word = "Eat" //Error #2
}
else if (choice1 == 3)
{
word = "Sleep"; //Error #3
}
printf("You will now be %sing",word);
}
El operador =
no se puede utilizar para copiar el contenido de una matriz a la otra; debe usar una función de biblioteca como strcpy
o strcat
para cadenas, memcpy
para no cadenas (o asignar elementos de matriz individualmente).
Esto es una consecuencia de cómo C trata las expresiones de matriz. El estándar de lenguaje define una expresión matricial como un valor no modificable ; es un lvalor porque se refiere a un objeto en la memoria, pero puede no ser el objetivo de una asignación.
La operación de subíndice de matriz a[i]
se define como *(a + i)
; es decir, dada la dirección de la matriz a
, compensar los elementos i
de esa dirección y eliminar la referencia al resultado. Dado que la expresión de la matriz a
se trata como un puntero, la mayoría de la gente piensa que a
variable almacena un puntero al primer elemento de la matriz, pero no lo hace. Todo lo que se almacena son los propios elementos de la matriz.
En cambio, cada vez que el compilador ve una expresión de matriz en una declaración, convierte esa expresión de tipo "matriz de elemento N de T
" a "puntero a T
", y el valor de la expresión se convierte en la dirección del primer elemento de la matriz (a menos que la expresión sea el operando de sizeof
o unary &
operator, o sea una cadena literal que se usa para inicializar otra matriz en una declaración).
Y es por esto que una expresión de matriz como word
no puede ser el objetivo de una asignación; no hay nada que asignar. No hay una word
objeto que exista independientemente de la word[0]
, la word[1]
, etc.
Cuando escribes
word = "Jump";
el tipo de la expresión "Jump"
se convierte de "matriz de 5 elementos de char
" a "puntero a char
", y el valor de la expresión es la dirección del primer elemento de la matriz. Y está intentando asignar ese valor de puntero a un objeto de matriz , que a) no es un puntero, yb) no se puede asignar de ninguna manera.
Usa stcpy
desde <string.h>
-
strcpy(word,"Jump");
Y similares para el resto de ellos.
Simplemente no puedes hacer word ="Jump"
. Como los contenidos son modificables, los arreglos en sí mismos no lo son.
TL; respuesta de DR : un nombre de matriz no es un valor lime modificable. Por lo tanto, no puede usar el operador de asignación ( =
) en eso.
Para copiar el contenido en la matriz, debe usar strcpy()
de string.h
( char
array) o memcpy()
en general.
Ahora, para elaborar la razón real detrás del mensaje de error, citando C11
, capítulo §6.5.16, Assignment operators
el operador de asignación tendrá un lvalue modificable como su operando izquierdo.
y luego, citando el capítulo §3.3.2.1 del mismo estándar,
Un lvalue modificable es un lvalue que no tiene tipo de matriz, [....]
Por lo tanto, un nombre de matriz no es un valor modificable , por lo tanto, no puede asignarle nada. Esta es la razón detrás del mensaje de error.