C 将字符串写入初始化的空白字符数组

C 将字符串写入初始化的空白字符数组,c,C,我刚刚开始学习C语言,对于如何将字符串写入C语言中的简单字符数组感到困惑。我知道C语言没有字符串数据类型,我读到大多数网站都是用这种方式声明字符串的 char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; char greeting[] = "Hello"; 但是,如果我已经初始化了 char greeting[50]; 我试着给它一个字符串值 char greeting[50]; greeting = "Zack"; 我收到一个错误,为什么

我刚刚开始学习C语言,对于如何将字符串写入C语言中的简单字符数组感到困惑。我知道C语言没有字符串数据类型,我读到大多数网站都是用这种方式声明字符串的

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";
但是,如果我已经初始化了

char greeting[50];
我试着给它一个字符串值

char greeting[50];
greeting = "Zack";
我收到一个错误,为什么?

您使用
strcpy()

这将把四个字符和终止零复制到
问候语中


请注意,它对
问候语
中的可用空间一无所知,因此完全有可能做错事。

strcpy
用于复制“字符串”。 使用方法如下:

char greeting[50];
strcpy(greeting, "Zack");

如果目标不够大,请注意可能发生的溢出。

您会收到一个错误,因为您基本上是在尝试将字符串常量分配给数组。数组
greeting
衰减为指针,但它是
char*const
指针


您需要使用来复制文本。

使用头
中声明的标准函数
strcpy
,以复制字符数组中的字符串

#include <string.h>

//...

char greeting[50];
strcpy( greeting, "Zack" );
使用
strcat
代替
strcpy

#include <string.h>

//...

char greeting[50];

greeting[0] = '\0';
strcat( greeting, "Zack" );
但是,当您可以指定字符数组时,有一个技巧。为此,需要在结构中包含字符数组并使用复合文字。例如与数组相反,结构具有执行结构的成员复制的赋值运算符

#include <stdio.h>
#include <string.h>

int main(void) 
{
    struct A { char greeting[50]; } s;
    s = ( struct A) { "Zack" };

    puts( s.greeting );

    return 0;
}

要编译此代码,您需要一个支持C99的编译器。

在C中,以下代码将打印“foo”:

这是因为数组的变量(greeting)包含指向它的第一个元素(greeting[0])的指针

因此,如果你同意:

greeting = "Zack";
您的意思是:让问候语具有文本字符串“Zack”在内存中的地址


由于不允许更改数组的地址,因此会出现错误。

在C中,数组是常量引用。你不能改变它们。这就是为什么你必须遵循@doctorlove-answer来做这个assignment@user3204469数组包含指向其第一个元素的指针是一个错误的语句。@Baldrickk,我知道问题是:“为什么这个语句是错误的?”而不是“如何将字符串复制到数组?”。抱歉,我误解了。@user3204469您似乎在宽限期内编辑了答案,但在我发表评论时,答案没有更新。现在看起来不错,不过应该是“数组变量(
greeting
)降级为指向第一个元素的指针”,因为正如Vlad所说,数组不包含指向自身的指针。。。
char greeting[50];
greeting = "Zack";
#include <stdio.h>
#include <string.h>

int main(void) 
{
    struct A { char greeting[50]; } s;
    s = ( struct A) { "Zack" };

    puts( s.greeting );

    return 0;
}
Zack
char greeting[50];
if(greeting == &greeting[0]){
    printf("foo");
}
else{
    printf("bar");
}
greeting = "Zack";