我对以下内容感到有些惊讶。
示例1:
char s[100] = "abcd"; // declare and initialize - WORKS
示例2:
char s[100]; // declare
s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error)
我想知道为什么第二种方法不起作用。它应该是自然的(它适用于其他数据类型)?有人能解释一下这背后的逻辑吗?
答案 0 :(得分:50)
初始化数组时,C允许您使用值填充它。所以
char s[100] = "abcd";
与
基本相同int s[3] = { 1, 2, 3 };
但它不允许你进行赋值,因为s
是一个数组而不是一个空闲指针。
s = "abcd"
是将abcd
的指针值指定给s
,但您无法更改s
,因为此时没有任何内容指向数组。
如果s
是char*
- 一个可以指向任何内容的指针,这可以而且确实有效。
如果要复制字符串,请使用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)
初始化和赋值是两个不同的操作,碰巧在这里使用相同的运算符(“=”)。
这样想:
想象一下,有两个函数,称为InitializeObject
和AssignObject
。当编译器看到thing = value
时,它会查看上下文并在您创建新InitializeObject
时调用一个thing
。如果不是,则会调用AssignObject
。
通常情况下这是正常的InitializeObject
和AssignObject
通常表现相同。除了处理char数组(以及一些其他边缘情况)时,在这种情况下它们的行为不同。为什么这样?好吧,这是一个涉及堆栈与堆等的其他帖子,依此类推。
答案 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";