我有点惊讶以下内容。将字符串分配给字符数组
例1:
char s[100] = "abcd"; // declare and initialize - WORKS
例2:
char s[100]; // declare
s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error)
我不知道为什么第二个方法是行不通的。它应该(它与其他数据类型一起使用)看起来很自然吗?有人能向我解释这背后的逻辑吗?
我有点惊讶以下内容。将字符串分配给字符数组
例1:
char s[100] = "abcd"; // declare and initialize - WORKS
例2:
char s[100]; // declare
s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error)
我不知道为什么第二个方法是行不通的。它应该(它与其他数据类型一起使用)看起来很自然吗?有人能向我解释这背后的逻辑吗?
当初始化数组,C允许你来填补它值。所以
char s[100] = "abcd";
是基本相同
int s[3] = { 1, 2, 3 };
,但它不允许你做assignmend S是一个数组,而不是一个自由的指针。的
s = "abcd"
的意思是分配“ABCD”,以“S”的指针值,但你不能改变•从那以后什么都不会指向数组。
如果s是char*
- 这个指针可以指向任何东西,它可以并且确实有效。
,如果你要复制的字符串使用简单的strcpy
初始化和赋值是在这里使用相同运算符(“=”)的两种截然不同的运算。
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);
不是推荐的方法。注意strncpy的怪异点:http://stackoverflow.com/a/1258577/2974922 – nucleon 2017-02-23 10:40:39
1 char s[100];
2 s = "hello";
在您提供的例子,S实际上是在第1行初始化,不就行了2.即使你不给它赋值明确在这一点上,编译器做到了。在第2行中,您正在执行赋值操作,并且您不能将一个字符数组分配给另一个像这样的字符数组。您必须使用strcpy()或某种循环来分配数组的每个元素。
初始化和分配是发生在这里使用同一个运营商(“=”)两种不同的操作。
认为它是这样的:
试想一下,有2个功能,称为InitializeObject
和AssignObject
。当编译器看到thing = value
时,它会查看上下文,如果您正在创建新的thing
,则会调用InitializeObject
。如果你不是,它会调用AssignObject
。
通常这很好,因为InitializeObject
和AssignObject
通常表现相同的方式。除了处理char数组(和其他一些边缘情况)时,在这种情况下它们的行为有所不同。为什么要这样做?那么这是一个涉及堆栈和堆等等的整个其他职位。
PS:顺便说一句,这样它的思想也将帮助您了解拷贝构造函数和其他类似的东西,如果你曾经涉足C++
请注意,您仍然可以做:
s[0] = 'h';
s[1] = 'e';
s[2] = 'l';
s[3] = 'l';
s[4] = 'o';
s[5] = '\0';
我会用是
char *s = "abcd";
您可以使用此:
yylval.sval=strdup("VHDL + Volcal trance...");
其中 yylval是char *。从事这项工作。
好的答案,除非你不应该再使用普通的strcpy。使用strncpy或strlcpy。 – dwc 2009-02-23 23:01:39
另外,s应该是const char *,不是char *。 – aib 2009-02-24 14:17:25
`s [0] ='x'; s [1] ='y'; s [2] ='z'; s [3] ='m';`如果想要在初始化之后逐个替换字符串,则工作正常。 – RBT 2016-10-28 02:44:01