これが私の最初の投稿です。私はこの選択をしようとしていますが、ユーザーに数字を入力するのではなく数字だけを選択するようにします(簡単です)が、数字を文字列に等しくしたいときは、「配列型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);
}
TL; DRanswer:配列nameはnot変更可能な左辺値。そのため、割り当て演算子(_=
_)は使用できません。
コンテンツを配列にコピーするには、 strcpy()
from _string.h
_(char
array)または memcpy()
一般的に。
ここで、エラーメッセージの背後にある実際の理由を詳しく説明するために、_C11
_、§6.5.16、_Assignment operators
_を引用します
代入演算子は、左オペランドとして変更可能な左辺値を持たなければなりません。
そして、同じ標準から§6.3.2.1の章を引用し、
変更可能な左辺値は、配列型を持たない左辺値です。[....]
したがって、配列名は変更可能な左辺値ではないため、assignには何もできません。これがエラーメッセージの原因です。
_=
_演算子を使用して、ある配列のcontentsを別の配列にコピーすることはできません。文字列にはstrcpy
やstrcat
、文字列以外にはmemcpy
などのライブラリ関数を使用する必要があります(または配列要素を個別に割り当てます)。
これは、Cが配列式を処理する方法の結果です。配列式は、言語標準で変更不可能な左辺値;と定義されています。メモリ内のオブジェクトを参照するため、左辺値ですが、割り当てのターゲットではない場合があります。
配列添え字操作_a[i]
_は、*(a + i)
;として定義されます。つまり、配列アドレスa
を指定し、そのアドレスからi
要素をオフセットし、結果を逆参照します。配列式a
はポインターとして扱われるため、ほとんどの人はa
変数stores配列の最初の要素へのポインターと考えますが、そうではありません。格納されるのは、配列要素自体です。
代わりに、コンパイラーがステートメントで配列式を検出するたびに、変換タイプ「T
のN要素配列」から「T
へのポインター」の式、および式の値は配列の最初の要素のアドレスになります(式がsizeof
または単項_&
_演算子のオペランドである場合、または初期化に使用される文字列リテラルである場合を除きます宣言内の別の配列)。
そして、これがWord
のような配列式を代入の対象にできない理由です。割り当てるものはありませんto。 _Word[0]
_、_Word[1]
_などとは独立して存在するオブジェクトWord
はありません。
書くとき
_Word = "Jump";
_
式_"Jump"
_の型は、「char
の5要素配列」から「char
へのポインター」に変換され、式の値は最初のアドレスです配列の要素。そして、そのpointer値をarrayオブジェクトに割り当てようとしています。これはa)ポインターではなく、b)に割り当てられません。
<string.h>
-からstcpy
を使用します
strcpy(Word,"Jump");
そして、それらの残りについても同様です。
ただWord ="Jump"
することはできません。内容は変更可能であるため、arrays自体は変更できません。