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

时间:2012-07-08 07:39:35

标签: c

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

#include<stdio.h>
int main()
{
char str1[]="hello";
char str2[10];
str2=str1;
printf("%s",str2);
return 0;
}

然而,如果我使用指针而不是像这里那样工作..

#include<stdio.h>
int main()
(
char *s="good morning";
char *q;
q=s;
while(*q!='\0')
{
printf("%c",*q);
q++;
}
return 0;
}

这很有效。 现在字符串已经通过指针复制了,为什么会出现这种差异?

5 个答案:

答案 0 :(得分:1)

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

至于您的指针示例,q=s重新指定q以指向s指向的相同空间。但是,指针重新分配会复制值。

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

答案 1 :(得分:0)

你需要做

strcpy (str2, str1)

您需要逐个字符地复制str1str2字符的每个元素。

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

即使您有char *str2;然后str2 = str1,但您的代码仍然有效,但在这种情况下不会复制字符串,而是会复制str1中字符串的地址在str2中,现在解除引用str2将指向字符串

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

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

答案 2 :(得分:0)

str2str1指的是他们的第一个元素的地址 所以不以这种方式完成数组的分配 使用str[]来按char分配char 或使用内置strcpy

答案 3 :(得分:0)

您也可以使用strdup()来分配存储副本所需的确切空间量。

答案 4 :(得分:0)

在C中,您只能分配 type 的对象;在C中,字符串不是数据类型。相反,它是一种约定 - 惯例是字符串由以空字符结尾的字符数组表示;并且因为数组不被视为类型,所以也不是字符串。

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