有没有简单的方法来复制C字符串?
我有const char *stringA
,并且我希望char *stringB
接受该值(请注意stringB
不是const
)。我尝试了stringB=(char*) stringA
,但是这使得stringB
仍然指向相同的内存位置,因此当stringA
以后更改时,stringB
也会这样做。
我也尝试过strcpy(stringB,stringA)
,但似乎如果stringB
没有初始化为足够大的数组,则会出现段错误。我对C字符串不是很有经验,我是否缺少明显的东西?
如果我只是将stringB
初始化为char *stringB[23]
,因为我知道我的字符串永远不会超过22
字符(并允许使用空终止符),这是正确的方法吗?如果检查stringB
与其他C字符串是否相等,那么多余的空间会影响什么吗?
(这里只使用字符串不是解决方案,因为我需要最小的开销并易于访问单个字符。)
最佳答案
您可以使用 strdup()
返回C字符串的副本,如下所示:
#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
stringB = strdup(stringA);
/* ... */
free(stringB);
您也可以使用
strcpy()
,但是您需要首先分配空间,这并不难,但是如果执行不正确,则会导致溢出错误:#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
/* you must add one to cover the byte needed for the terminating null character */
stringB = (char *) malloc( strlen(stringA) + 1 );
strcpy( stringB, stringA );
/* ... */
free(stringB);
如果您不能使用
strdup()
,我建议使用 strncpy()
而不是strcpy()
。 strncpy()
函数最多可以复制n
个字节,并且最多只能复制strlen(stringA) + 1 > n
个字节,这有助于避免溢出错误。但是,如果使用stringB
,则需要自己终止strdup()
。但是,通常来说,您会知道您需要什么尺寸的东西:#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
/* you must add one to cover the byte needed for the terminating null character */
stringB = (char *) malloc( strlen(stringA) + 1 );
strncpy( stringB, stringA, strlen(stringA) + 1 );
/* ... */
free(stringB);
我个人认为
malloc()
更干净,因此我尝试在专门用于字符串的地方使用它。从性能的角度来看,我不知道POSIX/non-POSIX方法是否存在严重的缺点,但是我不是C或C++专家。请注意,我将
char *
的结果转换为c++
。这是因为您的问题被标记为malloc()
问题。在C++中,需要从strdup()
强制转换结果。但是,在C中,您不会强制转换。编辑
在这里,您会遇到一个复杂的问题:
strcpy()
不在C或C++中。因此,请将strncp()
或malloc
与预先设置大小的数组或strncp()
-ed指针一起使用。在任何可能使用该函数的地方,都使用strcpy()
而不是ojit_code是一个好习惯。这将有助于减少潜在的错误。