数组类型char []不可分配

时间:2015-08-31 14:03:03

标签: c arrays string assignment-operator

这是我的第一篇文章。我一直在尝试选择这个选项,我希望用户只选择数字而不是键入它们(更容易)但是当我希望数字等于一个字符串时,它表示“数组类型#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}}

4 个答案:

答案 0 :(得分:21)

您无法分配给数组,只能复制

改为使用strcpy,例如

strcpy(word, "Jump");

答案 1 :(得分:9)

TL; DR 回答:数组名称 可修改的左值。因此,您无法使用赋值运算符(=)。

要将内容复制到数组中,您需要使用string.hchar数组)或strcpy()中的memcpy()

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

  

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

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

  

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

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

答案 2 :(得分:7)

=运算符不能用于将一个数组的内容复制到另一个数组;您必须使用strcpystrcat等库函数作为字符串,memcpy表示非字符串(或单独指定数组元素)。

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

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

相反,只要编译器在语句中看到数组表达式,它就转换该表达式来自类型&#34; N元素数组T&#34; to&#34;指向T&#34;的指针,表达式的值成为数组第一个元素的地址(除非表达式是sizeof或一元{的操作数{1}}运算符,或者是一个字符串文字,用于初始化声明中的另一个数组)。

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

写作时

word[1]

表达式word = "Jump"; 的类型是从"Jump"&#34;的&#34; 5元素数组转换而来的to&#34;指向char&#34;的指针,表达式的值是数组第一个元素的地址。并且您正在尝试将指针值分配给数组对象,其中a)不是指针,而b)无论如何都无法分配。

答案 3 :(得分:1)

使用stcpy -

中的<string.h>
 strcpy(word,"Jump");

与其他人相似。

你无法做word ="Jump"。由于内容是可修改的,数组本身不是。