如何复制const char *类型变量的内容?

时间:2014-10-16 08:30:52

标签: c++ c pointers

我知道:

之间的区别
char *a = "string";
char p[] = "string";

来自*a,它充当以下内容......

     +-----+     +---+---+---+---+---+---+---+ 
  a: |  *======> | s | t | r | i | n | g |\0 |    
     +-----+     +---+---+---+---+---+---+---+ 

如果我想创建另一个变量说

char *b;

我希望它将指针中的所有内容复制到一个点而不是指向a的内容。

     +-----+     +---+---+---+---+---+---+---+      
  a: |  *======> | s | t | r | i | n | g |\0 |    
     +-----+     +---+---+---+---+---+---+---+ 
  b: |  *======> | s | t | r | i | n | g |\0 |    
     +-----+     +---+---+---+---+---+---+---+ 

怎么做?

5 个答案:

答案 0 :(得分:7)

在C中,您可以分配一个新的缓冲区b,然后使用标准库函数复制您的字符串,如下所示:

b = malloc((strlen(a) + 1) * sizeof(char));
strcpy(b,a);

请注意+1中的malloc,以便为终止'\0'腾出空间。 sizeof(char)是多余的,但我使用它来保持一致性。

在C ++中,您应该使用更安全,更优雅的std::string

std::string b {a};

答案 1 :(得分:6)

在C ++中,你可以做到

char *b = new char[strlen(a) + 1]{};
std::copy(a, a + strlen(a), b);

这是a live example。虽然,我建议使用std::string来保证其安全性和易用性。

答案 2 :(得分:4)

正如您发布的那样,

a的内容指向编译器设置的只读内存位置。如果你想在编译时让另一个具有不同的值,你必须自己定义一个:

char *a = "string";
char *b = "string"; // Nb. This might point to the same location as a

请注意,根据§2.14.5,这两个指针是否指向同一个内存位置实现已定义

  

是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。

否则请转到堆存储位置,如:

size_t len = strlen(a); // Doesn't include null-terminator character
char *b = new char[len+1];
memcpy(b, a, len); // Assumes plain ASCII string
b[len] = '\0';

无论如何,我会选择std::string

答案 3 :(得分:1)

您可以使用strdup中的非标准(但可在许多实现中使用)<string.h>函数:

char *b;
strdup(b, a);
...
free(b);

或者您可以使用malloc然后strcpy预订空间:

char *b;
b = malloc(strlen(a) + 1);
strcpy(b, a);
...
free(b);

答案 4 :(得分:1)

a的内容是您在图表中标记为*的内容。 a是您的小盒子,a的内容就在盒子里!

“字符串”不是a的内容。它位于内存中的其他位置,a包含该字符串的地址。

a的内容复制到b最终会这样做:

   +-----+     +---+---+---+---+---+---+---+      
a: |  *======> | s | t | r | i | n | g |\0 |    
   +-----+  /  +---+---+---+---+---+---+---+ 
b: |  *====/
   +-----+     

要实现您在第二个图表中绘制的内容,您需要复制a指向的所有数据。这不是直截了当的,因为你如何决定何时停止复制?没有一般的方法,但是如果您预先确定只想复制字符串,那么您可以使用复制字符串的函数。

常见但非标准的strdup函数将分配新空间并复制字符串。否则,您可以分配空间(以C中分配空间的任何常用方式),然后将字符串复制到分配的空间。