将字符串分配给字符数组

Ree*_*Ree 65 c

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

例1:

char s[100] = "abcd"; // declare and initialize - WORKS
Run Code Online (Sandbox Code Playgroud)

例2:

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

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

sho*_*osh 53

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

char s[100] = "abcd";
Run Code Online (Sandbox Code Playgroud)

基本上是一样的

int s[3] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

但它不允许你进行赋值,因为它s是一个数组而不是一个自由指针.的含义

s = "abcd" 
Run Code Online (Sandbox Code Playgroud)

是分配的指针值abcds,但你不能改变s,因为再没有什么将指向数组.
如果schar*- 一个可以指向任何东西的指针,这可以而且确实有效.

如果要复制字符串简单使用strcpy.

  • 很好的答案,除非你不应再使用简单的strcpy.使用strncpy或strlcpy. (5认同)
  • 此外,s应该是const char*,而不是char*. (3认同)
  • @dwc strcpy() 没有问题,只需确保缓冲区对于输入字符串足够长 (2认同)

dwc*_*dwc 49

C中没有"字符串"这样的东西.字符串是char的数组,char按惯例终止.由于无法在C中分配数组,因此也无法分配字符串.文字"你好"是语法糖\0

正确的方法是:

char s[100];
strncpy(s, "hello", 100);
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

#define STRMAX 100
char    s[STRMAX];
size_t  len;
len = strncpy(s, "hello", STRMAX);
Run Code Online (Sandbox Code Playgroud)

  • 不是推荐的方法.谨防strncpy的奇怪之处:http://stackoverflow.com/a/1258577/2974922 (2认同)

Spa*_*arr 12

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