给字符数组赋值

19

我输入时没有错误提示

char a[10] = "Hi";

但是当我把它改成以下内容时,我会得到一个错误:Array type char is not assignable.

char a[10];
a = "Hi";

为什么字符数组类型不可赋值?这是因为语言本身就是有意这样设计的还是我漏掉了某个要点?


回复:由于这被标记为C ++,在处理char []时是否有一种“更C ++”方式来完成此操作而不是使用strcpy? - user166390
一种更符合C++的方式是使用string或vector<char>而不是char[]。通过使用char[],您基本上接受了所有与C有关的内容。 - Cogwheel
被提名重新开放,因为这个标签是C++,而“重复”中说的是“在C中”。我知道答案无论如何都是相同的,但它们仍然是不同的语言,答案可能会有所改变或者有值得在这里指出的细微差别。 - Jim Hunziker
7个回答

27

数组不是可修改的 lvalue

使用

char a[10];
strcpy(a, "Hi");

15

如我之前所评论的,C++做这件事情的方式是使用std::string而不是char[]。那样会给你期望中的赋值行为。

话虽如此,你仅在第二个例子中得到错误的原因是这两行中的=有不同的含义:

char a[10] = "Hi";
a = "Hi";

第一个是初始化,第二个是赋值。

第一行在堆栈上分配了足够的空间以容纳10个字符,并将其中的前三个字符初始化为'H'、'i'和'\0'。从这点开始,所有a做的就是引用堆栈上数组的位置。因为数组只是堆栈上的一个位置,所以a永远不允许更改。如果你想要在堆栈上的不同位置存储不同的值,你需要另一个变量。

另一方面,第二行(无效)尝试将a更改为引用(技术上不同的)"Hi"的咒语。由于上述原因,这是不允许的。一旦你有了一个初始化的数组,你唯一能做的就是从中读取值并向其中写入值。你不能改变它的位置或大小。在这种情况下,赋值会尝试做到这一点。


1
您介意提及一下可以使用 std::string 来实现 OP 想要的行为吗?我认为这将是一个好答案的有益补充。 - NathanOliver
1
是的,我通常会尝试给出两种回答来回应这样的问题(一个直接回答,另一个猜测意图)。由于问答者已经看到了我的评论,而且这个线程已经被关闭为重复问题,所以我想我不需要再回答了。 - Cogwheel

12

该语言不允许将字符串直接赋值给字符数组。你应该使用strcpy()代替:

strcpy(a, "Hi");

1
在这种情况下,你应该使用 strcpy。忘记你曾经听说过 strncpy 可能一点损失都没有 - 它几乎和 gets 一样没用。 - Jerry Coffin
关于“strcpy”和“strcpy_s”的区别?(链接:https://dev59.com/bVwY5IYBdhLWcg3w2K7c) - Quazi Irfan

2

a是指向数组的指针,而不是数组本身。它无法被重新分配。

顺便提一下,你标记了C++。对于这种情况最好使用std::string。这可能更符合你的期望。


1
a 是数组本身,而不是指向数组的指针。它可以被隐式转换为指向第一个元素的指针。 - Joseph Mansfield

1
简单,这个。
char a[10] = "Hi";

这是一个小的“额外功能”,因为它不能在运行时完成。

但这就是C/C++标准库存在的原因。

#include <string.h>

// ...
strcpy(a,"Test"); // STR-ing C-o-PY.

这来自于C标准库。如果使用C++,你应该使用std::string,除非你真的想从目标计算机中获得所有可能的性能。


0

这是因为初始化不是赋值。第一件有效的事情是初始化,而第二件预期中不起作用的事情是赋值。你不能简单地将值分配给数组,你应该使用类似于 strcpymemcpy 的东西。或者你可以选择使用来自 <algorithm>std::copy


-2

这很简单,(=) 有两种不同的含义:赋值和初始化。你也可以像这样编写你的代码

         #include <iostream>

         using namespace std;

          int main ()
         {
             char message[3] = {'H', 'i', '\0'};

                cout << message<< endl;

           return 0;

           } 

在这段代码中,你不需要编写复杂的代码或函数,甚至不需要使用string.h库。


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