将字符串分配给另一个字符串
为什么这段代码没有运行? 为什么str1没有分配给str2? 我知道我可以选择使用strcpy,但我想知道为什么这不起作用?
#include int main() { char str1[]="hello"; char str2[10]; str2=str1; printf("%s",str2); return 0; }
如果我使用指针比它在这里工作..
#include int main() ( char *s="good morning"; char *q; q=s; while(*q!='\0') { printf("%c",*q); q++; } return 0; }
这很有效。 现在字符串已经通过指针复制了,为什么会出现这种差异?
你需要这样做
strcpy (str2, str1)
你需要逐个str1
地复制str1
每个元素到str2
。
你正在做的是尝试将str1
assign中字符串的地址分配给不允许的数组var str2
。 静态数组不能用于指定值。
即使你有char *str2;
然后str2 = str1
虽然你的代码可以工作,但是在这种情况下不会复制字符串,而是在str2
复制str1
字符串的地址,所以现在取消引用str2
会指向字符串
另请注意,将字符串复制到char *str2
始终在复制前分配足够的内存。 一种可能性是:
str2 = malloc (sizeof (char) * (strlen (str1) + 1)); strcpy (str2, str1);
str2
是一个静态数组。 你不能像指针一样重新分配它。
至于你的指针示例, q=s
重新指定q
指向s
指向的相同空间。 但是,指针重新分配不会复制该值。
对于静态数组,请使用strcpy()
复制该值。 对于指针,请使用strdup()
。
str2
和str1
引用它们的第一个元素的地址,因此不以这种方式完成数组的赋值使用str[]
通过char分配char或使用内置的strcpy
您也可以使用strdup()来分配存储副本所需的确切空间量。
在C中,您只能分配具有类型的对象; 在C中,字符串不是数据类型。 相反,它是一种约定 – 惯例是字符串由以null结尾的字符数组表示; 并且因为数组不被视为类型,所以也不是字符串。
在你的第二个代码片段中,你只需要q
指向s
; 这不是s
字符串的副本 ,而只是指针”的副本。 它们都引用内存中的相同数据。 因此,如果您在’s’处更改了字符串,然后在’q’处打印了字符串,您将看到’q’处的数据也已更改。 如果你做了printf( "s:%p, q:%p" (void*)s, (void*)q ) ;
更直接printf( "s:%p, q:%p" (void*)s, (void*)q ) ;
你会看到它们都拥有相同的指针值。