Подтвердить что ты не робот

Тип массива char [] не может быть назначен

Ну вот мой первый пост. Я пытался сделать этот выбор, и я хочу, чтобы пользователь выбирал только цифры вместо того, чтобы вводить их (проще), но когда я хочу, чтобы числа были равны строке, он говорит: "Тип массива char[30] не может быть назначен". Даже если на спине я помещаю полуточку или нет.

#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);

}
4b9b3361

Ответ 1

Вы не можете назначить массив, только скопируйте его.

Используйте strcpy, например

strcpy(word, "Jump");

Ответ 2

TL; DR ответ: имя массива не изменчивое значение lvalue. Таким образом, вы не можете использовать оператор присваивания (=).

Чтобы скопировать содержимое в массив, вам нужно использовать strcpy() из массива string.h (char) или memcpy() в целом.


Теперь, чтобы выяснить фактическую причину сообщения об ошибке, процитировав C11, главу §6.5.16, Assignment operators

оператор присваивания должен иметь изменяемое значение lvalue в качестве его левого операнда.

а затем, цитируя главу §6.3.2.1 из того же стандарта,

Модифицируемое lvalue является lvalue, не имеющим тип массива, [....]

Таким образом, имя массива не является изменяемым значением lvalue, следовательно, вы не можете назначить ему что-либо. Это является причиной сообщения об ошибке.

Ответ 3

Оператор = не может использоваться для копирования содержимого одного массива в другой; вы должны использовать библиотечную функцию типа strcpy или strcat для строк, memcpy для не-строк (или отдельно назначать элементы массива).

Это следствие того, как C обрабатывает выражения массива. Выражение массива определяется стандартом языка как немодифицируемое значение lvalue; это значение lvalue, потому что оно относится к объекту в памяти, но оно не может быть целью назначения.

Операция подстроки массива a[i] определяется как *(a + i); то есть с учетом адреса массива a, смещения i элементов из этого адреса и разыменования результата. Поскольку выражение массива a рассматривается как указатель, большинство людей думает, что переменная a хранит указатель на первый элемент массива, но это не так. Все, что хранится, - это сами элементы массива.

Вместо этого, всякий раз, когда компилятор видит выражение в выражении в выражении, он преобразует это выражение из типа "N-element array of T" в "указатель на T", а значение выражения становится адресом из первого элемента массива (если выражение не является операндом операторов sizeof или унарных &, или является строковым литералом, используемым для инициализации другого массива в объявлении).

И вот почему выражение массива типа word не может быть целью назначения; там нечего назначать. Нет объекта word, который существует независимо от word[0], word[1] и т.д.

Когда вы пишете

word = "Jump";

тип выражения "Jump" преобразуется из "5-элементного массива char" в "указатель на char", а значение выражения - это адрес первого элемента массива. И вы пытаетесь присвоить это значение указателю объекту массива, который a) не является указателем, а b) не может быть назначен в любом случае.

Ответ 4

Используйте stcpy от <string.h> -

 strcpy(word,"Jump");

И аналогичный для остальных из них.

Вы просто не можете сделать word ="Jump". Поскольку содержимое модифицируется, сами массивы не являются.