Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将一个字符串分配给另一个字符串_C - Fatal编程技术网

C 将一个字符串分配给另一个字符串

C 将一个字符串分配给另一个字符串,c,C,为什么这段代码没有运行?为什么str1没有分配给str2??我知道我可以选择使用strcpy,但我想知道这不起作用的原因 #include<stdio.h> int main() { char str1[]="hello"; char str2[10]; str2=str1; printf("%s",str2); return 0; } #包括 int main() { char str1[]=“你好”; char-str2[10]; str2=str1; printf(“%s”,

为什么这段代码没有运行?为什么str1没有分配给str2??我知道我可以选择使用strcpy,但我想知道这不起作用的原因

#include<stdio.h>
int main()
{
char str1[]="hello";
char str2[10];
str2=str1;
printf("%s",str2);
return 0;
}
#包括
int main()
{
char str1[]=“你好”;
char-str2[10];
str2=str1;
printf(“%s”,str2);
返回0;
}
但是如果我使用指针,它会像这里一样工作

#include<stdio.h>
int main()
(
char *s="good morning";
char *q;
q=s;
while(*q!='\0')
{
printf("%c",*q);
q++;
}
return 0;
}
#包括
int main()
(
char*s=“早上好”;
char*q;
q=s;
而(*q!='\0')
{
printf(“%c”,*q);
q++;
}
返回0;
}
这很有效。 现在字符串已经通过指针复制了,那么为什么会有这样的差异呢

strcpy(str2,str1)

您需要逐个字符将
str1
的每个元素复制到
str2

您正在做的是尝试将
str1
assign中字符串的地址分配给数组var
str2
,这是不允许的。静态数组不能用于分配值

即使您有
char*str2;
然后
str2=str1
虽然您的代码可以工作,但在这种情况下字符串不会被复制,而是
str1
中字符串的地址被复制到
str2
中,因此现在取消引用
str2
将指向该字符串

还请注意,当您将字符串复制到
char*str2
中时,请在复制之前分配足够的内存。 一种可能性是:

str2 = malloc (sizeof (char) * (strlen (str1) + 1));
strcpy (str2, str1);

str2
是一个静态数组。不能像指针一样重新分配它

对于指针示例,
q=s
重新分配
q
以指向
s
所指向的相同空间。但是,指针重新分配不会复制该值


对于静态数组,使用
strcpy()
复制值。对于指针,使用
strdup()

str2
str1
引用其第一个元素的地址 所以数组的赋值不是以这种方式完成的 使用
str[]
逐个字符分配字符
或者使用内置的strcpy,也可以使用strdup()它分配存储副本所需的确切空间量。

在C中,您只能分配具有类型的对象;在C中,字符串不是数据类型。相反,它是一种约定—约定是字符串由以null结尾的字符数组表示;由于数组不被视为类型,因此字符串也不是类型


在第二个代码片段中,您只需将
q
指向
s
;这不是
s
处字符串的副本,而只是指针“s”的副本。它们都引用内存中的相同数据。因此,例如,如果您在“s”处更改字符串,然后在“q”处打印字符串,您将看到“q”处的数据也发生了变化。更直接地说,如果你使用printf(“s:%p,q:%p”(void*)s,(void*)q);你会发现它们都持有相同的指针值。

内存的strlen可能重复的部分太小了一个字节,哦,这个函数在Windows中找到了吗?我想它只适用于兼容POSIX的操作系统。我错了吗?