carácter de tipo de matriz[] no es asignable [duplicate]

5 minutos de lectura

avatar de usuario
SkytheCoder

Bueno, aquí está mi primer post. He estado tratando de hacer esta elecció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 “tipo de matriz char[30] no es asignable”. Aunque al final ponga 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);

}

  • si desea asignar a word sin strcpy puedes hacer word escrito como const char *word.

    – Leroy

    31 de agosto de 2015 a las 14:06

  • Sorprendentemente, obtiene el error porque el tipo de matriz es char[] no es asignable. En C, no puede asignar cadenas como lo hace, porque no hay un tipo de cadena incorporado, solo matrices de caracteres sin formato. De todos modos, esta es una pregunta frecuente … alguien, por favor, encuentre un duplicado.

    – Lundin

    31 de agosto de 2015 a las 14:59


  • La respuesta aceptada en el “duplicado” no es una respuesta (meta.stackexchange.com/questions/225370/…), solo un enlace a una horrible pregunta frecuente.

    – Elise van Looij

    27 de junio de 2018 a las 14:53


no puedes asignar a una matriz, sólo Copiar lo.

Utilizar strcpy en cambio, como

strcpy(word, "Jump");

  • sugerir alguna función de biblioteca de terceros como strcpy sin identificar dónde/qué biblioteca externa debe descargarse e instalarse para acceder a ella es lo opuesto a estar preparado para el futuro.

    –David Bandel

    26 oct 2021 a las 5:09

  • @davidbandel strcpy es una función estándar de C. Definitivamente no es un “tercero”.

    – Un tipo programador

    26 oct 2021 a las 6:21

  • agregue esta línea para usar strcpy #include

    – Anees

    7 de noviembre de 2021 a las 16:23


avatar de usuario
Sourav Ghosh

TL;DR respuesta: una matriz nombre es no un valor l modificable. Por lo tanto, no puede usar el operador de asignación (=) en ese.

Para copiar el contenido en la matriz, debe usar strcpy() desde string.h (char matriz) o memcpy() en general.


Ahora bien, para elaborar el razón real detrás del mensaje de error, citando C11capítulo §6.5.16, Assignment operators

El operador de asignación tendrá un valor l modificable como su operando izquierdo.

y luego, citando el capítulo §6.3.2.1 de la misma norma,

A valor 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 puedes asignar nada a eso. Esta es la razón detrás del mensaje de error.

  • Pero me pregunto por qué la especificación C se define de esta manera. Parece razonable querer asignar de una matriz a otra …

    – nielsbot

    4 de febrero de 2016 a las 22:44

  • @nielsbot Puedo pensar en dos razones relacionadas: 1) no hay sobrecarga de operadores en C 2) nombres de matriz, decaen en el puntero al primer elemento en la mayoría de los casos (incluso cuando se usa como operando del operador de asignación), por lo que hay no hay forma directa de copiar el contenido. A lo sumo, se puede usar la dirección, pero ese no es el caso de uso que estamos buscando aquí.

    – Sourav Ghosh

    7 de octubre de 2020 a las 6:29

los = 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 cuerdas, memcpy para no cadenas (o asignar elementos de matriz individualmente).

Esta es una consecuencia de cómo C trata la matriz expresiones. El lenguaje estándar define una expresión de matriz como una lvalue no modificable; es un valor l porque se refiere a un objeto en la memoria, pero puede que no sea 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 matriz habla a acompensar i elementos de esa dirección y desreferenciar el resultado. Dado que la expresión de matriz a se trata como un puntero, la mayoría de la gente piensa a variable historias 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 instrucción, convierte esa expresión del tipo “arreglo de elementos 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 la sizeof o unario & operadores, o es un literal de cadena que se usa para inicializar otra matriz en una declaración).

Y es por eso que una expresión de matriz como word no puede ser el objetivo de una asignación; no hay nada que asignar para. no hay objeto word que existe independientemente de word[0], word[1]etc

Cuando escribes

word = "Jump";

el tipo de expresión "Jump" se convierte de “arreglo 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ás tratando de asignar eso puntero valor a un formación objeto, que a) no es un puntero, y b) no se puede asignar de todos modos.

avatar de usuario
ameyCU

Utilizar strcpy desde <string.h>

 strcpy(word,"Jump");

Y similar para el resto de ellos.

simplemente no puedes hacer word ="Jump". Como los contenidos son modificables, el arreglos ellos mismos no lo son.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad