Ответ 1
Вы не можете назначить массив, только скопируйте его.
Используйте strcpy
, например
strcpy(word, "Jump");
Ну вот мой первый пост. Я пытался сделать этот выбор, и я хочу, чтобы пользователь выбирал только цифры вместо того, чтобы вводить их (проще), но когда я хочу, чтобы числа были равны строке, он говорит: "Тип массива 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);
}
Вы не можете назначить массив, только скопируйте его.
Используйте strcpy
, например
strcpy(word, "Jump");
TL; DR ответ: имя массива не изменчивое значение lvalue. Таким образом, вы не можете использовать оператор присваивания (=
).
Чтобы скопировать содержимое в массив, вам нужно использовать strcpy()
из массива string.h
(char
) или memcpy()
в целом.
Теперь, чтобы выяснить фактическую причину сообщения об ошибке, процитировав C11
, главу §6.5.16, Assignment operators
оператор присваивания должен иметь изменяемое значение lvalue в качестве его левого операнда.
а затем, цитируя главу §6.3.2.1 из того же стандарта,
Модифицируемое lvalue является lvalue, не имеющим тип массива, [....]
Таким образом, имя массива не является изменяемым значением lvalue, следовательно, вы не можете назначить ему что-либо. Это является причиной сообщения об ошибке.
Оператор =
не может использоваться для копирования содержимого одного массива в другой; вы должны использовать библиотечную функцию типа 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) не может быть назначен в любом случае.
Используйте stcpy
от <string.h>
-
strcpy(word,"Jump");
И аналогичный для остальных из них.
Вы просто не можете сделать word ="Jump"
. Поскольку содержимое модифицируется, сами массивы не являются.