为什么我们需要使用strcpy()
将字符串复制到char数组中?
我已经浪费了2个小时了。它没有向我显示任何错误,但输出并不像我预期的那样,我努力了2个小时才发现错误。
它只是显示垃圾信息。
当我使用strcpy()
时,它可以正常工作。
答案 0 :(得分:2)
答案的另一个解释是char数组是一个基本类型,而不是被覆盖operator =
的类。
正如@ StianV.Svendenborg所提到的,将char数组分配给另一个意味着将其地址分配给另一个char指针变量。
char数组分配,如;
char test[4]={1,2,3,4};
将导致分配4个字节(每个字节用于 char 值)。
在算术等表达式中test
的结果就像指针一样。例如test+1
将指向第二个元素的地址,*(test+1) == 2
将为真,
print("%p",test)
将打印数组中第一个元素的地址。
如果您使用课程std::string
和operator=
,则函数将遍历所有这些已分配的字段,并在不考虑的情况下复制它们。
答案 1 :(得分:1)
答案很长:
一旦在C ++中声明了任何数组,无论是否为int, char or MyClass
数组,任何使用该数组名称的方法与使用指向数组中第一个元素的指针基本相同。一旦动态分配了数组,这就变得非常明显了,但静态分配的数组也是如此。
这意味着以下代码:
char arr[] = "Lorum ipsum";
意思是:
在堆栈上为12个字符分配足够的空间,让arr表现为指向第一个字符的指针,这个指针是const(即指向的点不能改变。)
因此,如果你试着写:
const char * arr2 = "hello";
arr = arr2; // Error
您真正要问的是:更改arr
,其行为类似于无法更改的指针,现在指向此常量字符串中的第一个字符。这是不允许的。
话虽如此,如果你改为使用指向常量字符串的指针,你可以使用所描述的语法:
const char * cstr1 = "Hello";
const char * cstr2 = "Bye";
cstr1 = cstr2; // All is good, you are only changing which
// c-string in the global data you are pointing to.
答案 2 :(得分:0)
简答:
这是因为数组是静态分配内存的,你不能重新初始化它们
阵列的大小是固定的
相反,您可以使用std::string
。
虽然,你可以像这样使用char*
指针。
答案 3 :(得分:0)
简答:
为了效率。对于那些不希望复制数组的人。
当您使用原始指针时,您需要考虑所有这些细节,例如memery管理,复制行为等,以实现您自己的性能要求。另外,你可以使用std::string
,它旨在满足大多数正常情况。
答案 4 :(得分:0)
所谓的C字符串源自C语言,它没有字符串处理的高级语言功能。这里有两个不同的概念需要理解:
"abc"
,""
,"my string literal"
第一个不可修改(modyfing为UB)数组char[n]
,其中n
是实际字符数加上 null字符 '\0'
,它重复字符串的结尾,必须始终存在。您可以使用array subscipting operator直接访问其各个元素,例如"abc"[1]
会产生'b'
个字符。
第二个是程序员声明的数组,可以保存C-string。例如:
#define STR_LEN 60
char str[STR_LEN+1] = "abc";
不要将数组初始值设定项与"abc"
字符串文字混淆,同样 相同的事情。实际上这样的initiliazer(对于这个数组大小)相当于:
char str[STR_LEN+1] = {'a', 'b', 'c', '\0'};
要处理字符串文字,您需要char
指针,而不是char
数组:
char *p_str = "abc" /* "abc" is string literal */
声明char
数组后,您无法直接为其指定字符串文字,例如:
str = "def"; /* wrong, str is array, not pointer (not l-value) */
将新字符串分配给数组(字符串变量)的唯一方法是修改其元素,例如:
str[0] = 'd';
str[1] = 'e';
str[2] = 'f';
str[3] = '\0'; /* very important */
您可以编写一个函数来代替分配单个字符,例如:
char *my_strcpy(char dst[], const char *src)
{
while ((*dst++ = *src++)) /* copying idiom */
;
return dst;
}
示例电话:
my_strcpy(str, "def");
my_strcpy(str, p_str);
您可以使用strcpy
(或更安全的strncpy
)代替您编写自己的功能。故事结束。