数组类型char[]不可赋值。

58

这是我的第一篇帖子。我一直在尝试使用选择功能,希望用户只能选择数字而不是输入它们(更容易),但当我想要将数字等于一个字符串时,它会显示“数组类型 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);

}

1
如果您不想使用 strcpy 分配给 word,您可以将 word 类型设置为 const char *word - Leroy
1
令人惊讶的是,您会因为字符数组类型char []不可分配而出现错误。在C中,您不能像所做的那样分配字符串,因为没有内置的字符串类型,只有原始字符数组。无论如何,这是一个非常常见的问题......请有人找到一个重复的。 - Lundin
“重复”中的被接受答案并不是一个答案(https://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an-answer?rq=1),只是一个指向可怕FAQ的链接。 - Elise van Looij
4个回答

72

你不能对数组进行赋值,只能向其复制内容。

使用strcpy代替,像这样:

strcpy(word, "Jump");

建议使用类似strcpy这样的第三方库函数,却不指明需要下载和安装哪个外部库来访问它,这是与未来兼容相反的做法。 - David Bandel
5
strcpy 是标准的 C 函数,绝对不是“第三方”的。 - Some programmer dude
3
将此行添加以使用strcpy #include<string.h> - Anees

21

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

要将内容复制到数组中,您需要使用来自 string.hstrcpy()char 数组)或一般情况下的 memcpy()


现在,为了详细阐述错误信息背后的实际原因,引用C11标准中的第§6.5.16章节中的话,关于赋值运算符

赋值运算符左操作数必须是可修改的左值。

然后,再引用同一标准的第§6.3.2.1章节:

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

所以,数组名不是可修改的左值,因此无法对其进行赋值。这就是错误消息背后的原因。

3
但我想知道为什么C规范要这样定义?把一个数组赋值给另一个数组似乎是合理的需求... - nielsbot
@nielsbot 我能想到两个相关的原因 - 1)C语言中没有运算符重载 2)数组名称在大多数情况下(包括作为赋值运算符操作数时)会衰减为指向第一个元素的指针 - 因此没有直接复制内容的方法。最多可以使用地址 - 但这不是我们在这里寻找的用例。 - Sourav Ghosh

14

=运算符不能将一个数组的内容复制到另一个数组中;您必须使用像strcpystrcat这样的库函数来处理字符串,对于非字符串,则使用memcpy(或单独分配数组元素)。

这是C语言如何处理数组表达式的结果。数组表达式被定义为“不可修改的左值”;它是左值,因为它引用存储在内存中的对象,但它可能不是赋值的目标。

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

相反,每当编译器在语句中看到一个数组表达式时,它就会将该表达式从类型“N元素数组”转换为“指向T的指针”,并且该表达式的值成为数组的第一个元素的地址(除非表达式是sizeof或一元&运算符的操作数,或是用于在声明中初始化另一个数组的字符串字面量)。

这就是为什么像word这样的数组表达式不能成为赋值的目标;没有可供赋值的对象。不存在独立于word[0]word[1]等的对象word

当您写

word = "Jump";

表达式 "Jump" 的类型从 "由char组成的五元素数组" 转换为 "指向char的指针",而表达式的值是该数组第一个元素的地址。你试图将该指针的值赋给一个数组对象,但是 a) 该数组对象不是指针,b) 也无法进行分配。

5

使用来自<string.h>strcpy-

 strcpy(word,"Jump");

同样适用于其他的操作。

你不能只做 word ="Jump" 这样的操作。因为数组中的内容是可以修改的,但数组本身却不行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接