将字符串分配给字符数组

时间:2009-02-23 22:47:19

标签: c

我对以下内容感到有些惊讶。

示例1:

char s[100] = "abcd"; // declare and initialize - WORKS

示例2:

char s[100]; // declare
s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error)

我想知道为什么第二种方法不起作用。它应该是自然的(它适用于其他数据类型)?有人能解释一下这背后的逻辑吗?

9 个答案:

答案 0 :(得分:50)

初始化数组时,C允许您使用值填充它。所以

char s[100] = "abcd";

基本相同
int s[3] = { 1, 2, 3 };

但它不允许你进行赋值,因为s是一个数组而不是一个空闲指针。

的含义
s = "abcd" 

是将abcd的指针值指定给s,但您无法更改s,因为此时没有任何内容指向数组。
如果schar* - 一个可以指向任何内容的指针,这可以而且确实有效。

如果要复制字符串,请使用strcpy

答案 1 :(得分:49)

C中没有“字符串”这样的东西。在C中,字符串是char的一维数组,以空字符\0结尾。由于无法在C中分配数组,因此也无法分配字符串。文字“你好”是const char x[] = {'h','e','l','l','o','\0'};

的语法糖

正确的方法是:

char s[100];
strncpy(s, "hello", 100);

或更好:

#define STRMAX 100
char    s[STRMAX];
size_t  len;
len = strncpy(s, "hello", STRMAX);

答案 2 :(得分:10)

初始化和赋值是两个不同的操作,碰巧在这里使用相同的运算符(“=”)。

答案 3 :(得分:3)

1    char s[100];
2    s = "hello";

在您提供的示例中,s实际上是在第1行而不是第2行初始化的。即使您此时没有明确地为其分配值,编译器也会这样做。在第2行,您正在执行赋值操作,并且您不能将一个字符数组分配给另一个字符数组,如下所示。你必须使用strcpy()或某种循环来分配数组的每个元素。

答案 4 :(得分:2)

展开Sparr's answer

  

初始化和赋值是两个不同的操作,碰巧在这里使用相同的运算符(“=”)。

这样想:

想象一下,有两个函数,称为InitializeObjectAssignObject。当编译器看到thing = value时,它会查看上下文并在您创建新InitializeObject时调用一个thing。如果不是,则会调用AssignObject

通常情况下这是正常的InitializeObjectAssignObject通常表现相同。除了处理char数组(以及一些其他边缘情况)时,在这种情况下它们的行为不同。为什么这样?好吧,这是一个涉及堆栈与堆等的其他帖子,依此类推。

PS:另外,如果你冒险进入C ++,以这种方式思考它也会帮助你理解复制构造函数和其他类似的东西

答案 5 :(得分:0)

请注意,您仍然可以:

s[0] = 'h';
s[1] = 'e';
s[2] = 'l';
s[3] = 'l';
s[4] = 'o';
s[5] = '\0';

答案 6 :(得分:0)

我知道已经回答了这个问题,但是我想分享给一个在C / C ++ Facebook小组中提出类似问题的人的答案。


数组没有赋值运算符功能*。这意味着您不能简单地将char数组分配给字符串文字。为什么?因为数组本身没有任何赋值运算符。 (*这是一个不可更改的const指针。)

  

数组只是一个连续分配的内存区域,其名称   数组的实际是指向数组第一个元素的指针。   (摘自https://www.quora.com/Can-we-copy-an-array-using-an-assignment-operator

要将字符串文字(例如"Hello world""abcd")复制到char数组中,必须将字符串文字的所有char元素手动复制到数组中。

char s[100];这将初始化一个长度为100的空数组。

现在要将字符串文字复制到此数组上,请使用strcpy

strcpy(s, "abcd");这将复制字符串文字"abcd"中的内容并将其复制到s[100]数组中。

这是一个很好的例子:

int i = 0; //start at 0
do {
    s[i] = ("Hello World")[i]; //assign s[i] to the string literal index i
} while(s[i++]); //continue the loop until the last char is null

您显然应该使用strcpy而不是此自定义字符串文字复印机,但这是一个很好的示例,说明了strcpy的基本工作原理。

希望这会有所帮助!

答案 7 :(得分:-1)

您可以使用:

yylval.sval=strdup("VHDL + Volcal trance...");

其中 yylval是char *。 strdup from the work。

答案 8 :(得分:-3)

我将使用的是

char *s = "abcd";