数组类型char []不可分配

Sky*_*der 21 c arrays string assignment-operator

那么这是我的第一篇文章.我一直在尝试做这个选择选择的东西,我希望用户只选择数字而不是键入它们(更容易)但是当我希望数字等于一个字符串时,它说"数组类型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);

}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 24

您不能分配给数组,只能复制到它.

strcpy相反,请使用

strcpy(word, "Jump");
Run Code Online (Sandbox Code Playgroud)

  • @DavidBandel `strcpy` 是一个标准的 C 函数。这绝对不是“第三者”。 (5认同)
  • 添加此行以使用 strcpy #include&lt;string.h&gt; (3认同)

Sou*_*osh 10

TL; DR答案:数组名称修改的左值.因此,您不能使用赋值运算符(=).

要将内容复制到数组中,您需要使用strcpy()from string.h(char数组)或memcpy()一般情况.


现在,详细说明错误消息背后的实际原因,引用C11,章节§6.5.16,Assignment operators

赋值运算符应具有可修改的左值作为其左操作数.

然后,引用相同标准的第6.3.2.1章,

修改的左值是不具有左值数组类型,[...]

因此,数组名称不是可修改的左值,因此,您无法为其分配任何内容.这是错误消息背后的原因.

  • 但我想知道为什么 C 规范是这样定义的?想要从一个数组分配到另一个数组似乎是合理的...... (3认同)

Joh*_*ode 7

=操作者不能用于复制的内容一个阵列到另一个; 你必须使用像strcpystrcat用于字符串的库函数,memcpy用于非字符串(或单独分配数组元素).

这是C处理数组表达式的结果.数组表达式由语言标准定义为不可修改的左值 ; 它是左值,因为它引用了内存中的对象,但它可能不是赋值的目标.

数组下标操作a[i]定义为*(a + i); 也就是说,给定数组地址 a,i来自该地址的偏移元素并取消引用结果.由于数组表达式a被视为指针,因此大多数人认为a变量存储指向数组第一个元素的指针,但事实并非如此.所有存储的都是数组元素本身.

相反,只要编译器在语句中看到数组表达式,它就会将该表达式从"N-element array of " 类型转换T为"指向T",而表达式的值将成为数组第一个元素的地址(除非表达式是sizeof或一元运算&符的操作数,或者是用于在声明中初始化另一个数组的字符串文字.

这就是为什么数组表达式word不能作为赋值的目标; 什么都没有分配.有没有对象word存在独立word[0],word[1]等等.

当你写作

word = "Jump";
Run Code Online (Sandbox Code Playgroud)

表达式的类型"Jump"从"5元素数组char"转换为"指向char",表达式的值是数组第一个元素的地址.并且您正在尝试将该指针值分配给数组对象,a)不是指针,并且b)无论如何都无法分配.


ame*_*yCU 5

使用strcpy来自<string.h>-

 strcpy(word,"Jump");
Run Code Online (Sandbox Code Playgroud)

其余人也类似。

你就是做不到word ="Jump"。由于内容是可修改的,因此数组本身不可修改。