有没有简单的方法来复制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是一个好习惯。这将有助于减少潜在的错误。

08-16 13:21