web-dev-qa-db-ja.com

配列型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);

}
21
SkytheCoder

配列にassignすることはできません。配列にcopyのみです。

代わりに strcpy を使用します

strcpy(Word, "Jump");
21

TL; DRanswer:配列namenot変更可能な左辺値。そのため、割り当て演算子(_=_)は使用できません。

コンテンツを配列にコピーするには、 strcpy() from _string.h_(char array)または memcpy() 一般的に。


ここで、エラーメッセージの背後にある実際の理由を詳しく説明するために、_C11_、§6.5.16、_Assignment operators_を引用します

代入演算子は、左オペランドとして変更可能な左辺値を持たなければなりません。

そして、同じ標準から§6.3.2.1の章を引用し、

変更可能な左辺値は、配列型を持たない左辺値です。[....]

したがって、配列名は変更可能な左辺値ではないため、assignには何もできません。これがエラーメッセージの原因です。

10
Sourav Ghosh

_=_演算子を使用して、ある配列のcontentsを別の配列にコピーすることはできません。文字列にはstrcpystrcat、文字列以外には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)に割り当てられません。

7
John Bode

<string.h>-からstcpyを使用します

 strcpy(Word,"Jump");

そして、それらの残りについても同様です。

ただWord ="Jump"することはできません。内容は変更可能であるため、arrays自体は変更できません。

1
ameyCU