将字符串分配给char数组

时间:2012-04-10 12:19:05

标签: c++

我想知道为什么第一个语句有效,为什么不能用c ++中的第二个语句

char a[10]="iqbal";  // it works

a="iqbal"; // does not work 

7 个答案:

答案 0 :(得分:22)

严格来说,数组不是指针! 并且数组(数组的基地址)不能是可修改的左值 。即,它不能出现在赋值运算符的左侧。仅在某些情况下才会将衰减变为指针。阅读此SO post以了解数组何时衰减为指针。还有一个nice article解释了数组和指针之间的差异

另请阅读关于左值和右值here的内容,以便了解=

的LHS上无法显示的内容
  

char a [10] =“iqbal”; //它有效吗

在这种情况下,内部发生的事情是

a[0] = 'i';
a[1] = 'q'; 
 .
 .
a[5] = '\0';

所以一切都很好,因为array[i]是一个可修改的左值。

  

α= “伊克巴尔”; //不起作用

在内部,这大致相当于

0x60000(Address of a, but is a simple number here ) = Address of "iqbal"

这是错误的,因为我们无法为数字分配内容。

答案 1 :(得分:5)

char数组a将是静态的,如果像这样初始化它就无法更改。无论如何,你永远不能在c中分配字符串a =“iqbal”。你必须使用strncpy或memcpy。否则你会尝试覆盖指向字符串的指针,这不是你想要的。

所以正确的代码会做类似的事情:

char a[10];
strncpy(a, "iqbal", sizeof(a) - 1);
a[sizeof(a) - 1] = 0;

-1是为终止零保留一个字节。注意,如果字符串为null,则必须自行检查。坏api。有一个strlcpy()调用可以为你执行此操作,但它不包含在glibc中。

答案 2 :(得分:3)

第一行不是语句,而是具有初始化的声明。 第二行是带赋值运算符的表达式语句。

您无法在C中分配数组。

但您可以使用字符串文字的元素初始化数组。

答案 3 :(得分:1)

  

为什么第一个语句有效,为什么不在c ++中使用第二个语句

因为它们是不同的陈述,几乎完全无关。不要因为它们都使用=符号而感到困惑。在一种情况下,它表示对象初始化。在另一种情况下,赋值运算符。

您的第一行是合法的,因为初始化聚合(包括字符数组)是合法的。

您的第二行不合法,因为分配给数组是不合法的。

由于这是C ++,我可以建议您避免使用裸阵列吗?对于字符串,请使用std::string。对于其他阵列,请使用std::vector。如果你这样做,你的例子就变成了:

std::string a = "iqbal";  // it works
a="iqbal"; // so does this

答案 4 :(得分:0)

写作时 char a [10] =" iqbal" 您正在使用字符初始化字符数组 a 的元素。我们可以使用 int 类型执行相同操作(请注意 char 类型的处理稍有不同): int a [10] = {1,2,...};

但是在声明部分之后写下面的内容将无效,因为 a 将被视为指针。所以写点像 A = {1,2,...}; 或者a =" iqbal" 没有任何意义!

答案 5 :(得分:0)

尝试:

char a[10]="iqbal";
char *my_a = a;

并使用my_a。

答案 6 :(得分:0)

在 C++11 中,您可以使用 lambda 进行初始化,如下所示:

bool test = true;
/*const*/ char a[10] = { //Aggregate initialization
                        [=] //capture by value
                           ()//no parameters
                             { //start lambda
    switch (test) {
        case true: return *"test=true"; //*"xxx" don't return a pointer, but the 'string' itself
        case false: return *"test=false"; 
    } //switch
}()};  //}, close the lambda, (), call it, }; close aggregate initialization

当您的环境不支持 std::string 时,这会派上用场,例如 NVidia 的 CUDA 或一些奇怪的嵌入式环境。 lambda 被内联,所以在内部它转换为 char a[10] = test?"xxx":"yyy";

如果您可以选择这样做,您显然希望始终使用 std::string,因为固定大小的字符缓冲区从根本上说是个坏主意。

如果您使用 std::string,您可以使用以下命令将其转换为字符数组:chararray = mystring.c_str();。如果您坚持使用 printf: printf("s = %s", mystring.c_str());,这很有用。