2009-02-23 67 views
44

我有点惊讶以下内容。将字符串分配给字符数组

例1:

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

例2:

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

我不知道为什么第二个方法是行不通的。它应该(它与其他数据类型一起使用)看起来很自然吗?有人能向我解释这背后的逻辑吗?

回答

38

当初始化数组,C允许你来填补它值。所以

char s[100] = "abcd"; 

是基本相同

int s[3] = { 1, 2, 3 }; 

,但它不允许你做assignmend S是一个数组,而不是一个自由的指针。的

s = "abcd" 

的意思是分配“ABCD”,以“S”的指针值,但你不能改变•从那以后什么都不会指向数组。
如果s是char* - 这个指针可以指向任何东西,它可以并且确实有效。

,如果你要复制的字符串使用简单的strcpy

+3

好的答案,除非你不应该再使用普通的strcpy。使用strncpy或strlcpy。 – dwc 2009-02-23 23:01:39

+3

另外,s应该是const char *,不是char *。 – aib 2009-02-24 14:17:25

+1

`s [0] ='x'; s [1] ='y'; s [2] ='z'; s [3] ='m';`如果想要在初始化之后逐个替换字符串,则工作正常。 – RBT 2016-10-28 02:44:01

9

初始化和赋值是在这里使用相同运算符(“=”)的两种截然不同的运算。

41

C中没有“串”这样的字符串。字符串是字符数组,按照约定由NULL终止。既然你不能在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); 
+0

不是推荐的方法。注意strncpy的怪异点:http://stackoverflow.com/a/1258577/2974922 – nucleon 2017-02-23 10:40:39

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

在您提供的例子,S实际上是在第1行初始化,不就行了2.即使你不给它赋值明确在这一点上,编译器做到了。在第2行中,您正在执行赋值操作,并且您不能将一个字符数组分配给另一个像这样的字符数组。您必须使用strcpy()或某种循环来分配数组的每个元素。

2

要扩大Sparr's answer

初始化和分配是发生在这里使用同一个运营商(“=”)两种不同的操作。

认为它是这样的:

试想一下,有2个功能,称为InitializeObjectAssignObject。当编译器看到thing = value时,它会查看上下文,如果您正在创建新的thing,则会调用InitializeObject。如果你不是,它会调用AssignObject

通常这很好,因为InitializeObjectAssignObject通常表现相同的方式。除了处理char数组(和其他一些边缘情况)时,在这种情况下它们的行为有所不同。为什么要这样做?那么这是一个涉及堆栈和堆等等的整个其他职位。

PS:顺便说一句,这样它的思想也将帮助您了解拷贝构造函数和其他类似的东西,如果你曾经涉足C++

0

请注意,您仍然可以做:

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

我会用是

char *s = "abcd"; 
0

您可以使用此:

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

其中 yylval是char *。从事这项工作。