如何将char *复制到char [] []

时间:2015-09-22 21:27:54

标签: c arrays string

在开始之前,让我告诉你我的代码:

int     main(int argc, char *argv[])
{                  
  t_arbre       *node;
  char          str[3][1];

  &(*(str[0])) = strdup("1"); //lvalue required as left operand of assignment
  str[1] = strdup("2"); //incompatible types when assigning to type ‘char[1]’ from type ‘char *’
  str[2] = strdup("3");
  if ((node = malloc(sizeof(t_arbre))) == NULL)
    {
      printf("Error: malloc in the main function failed\n");
      return (-1);
    }
  create_node(node, str);
  return (0);
}

所以,正如你所看到的,我现在正在使用C.而我正在尝试将(char *)分配给(char [3] [1])。否则编译器会抛出我的错误:

  从类型'char *'

指定类型'char [1]'时,

不兼容的类型

当我尝试通过以下方式分配时:

str[2] = strdup("2"); 

我知道如果我声明一个像这样的字符串

char str[5];

然后尝试使用例如strdup()函数为其分配一个字符串,它可能会给我带来同样的错误。但是在这种情况下,我知道我可以“取消引用”它:

str[0] 

这将给我一个(char)变量。鉴于我希望它存储一个字符串。我必须使用'&'将其“转换”为(char *) charactere。哪个会给我

&str[0]

在这种情况下,它会起作用。因为我有一个指向第一个字符的指针。 通过这样做,我将能够将(char *)复制到(char [])。

否则,在我提供给你的上层代码中,我想将一个(char *)复制到一个(char [3] [1])(不要问我原因,解释哈哈有点长) 所以你可以看到,我试着解决错误,如

str[2] = strdup("2");

给我这个错误信息

  从类型'char *'

指定类型'char [1]'时,

不兼容的类型

通过这种方式

&(*(str[0])) = strdup("1"); //or &(*(str[0]))

给我这个错误信息

  

左值作为赋值的左操作数

有谁能告诉我如何将(char *)复制到(char [] [])? 或者做我想做的事情是不可能的? 我不会说英语,希望我使用正确的术语。

谢谢:)

3 个答案:

答案 0 :(得分:3)

  • 您无法分配不适合分配的内容,而"左值作为分配的左操作数需要" 是告诉你,因为你正在使用&获取某些内容的地址,这实际上只是一个值,而不是存储某些内容(例如变量),然后尝试分配给它。
  • char*不是char[],这是不兼容类型错误的含义。
  • C数组不支持赋值。
  • 别忘了在C中,数组从索引0开始,因此长度为3的数组中的最后一个有效索引是2(例如arr[2]),而不是3。

使用strcpy()代替将字符串复制到数组中:

char str[3][2]; // must allow space for the null terminator
strcpy(str[0], "1");
strcpy(str[1], "2");
strcpy(str[2], "3");

或者使用指针数组strdup()

char *str[3];
str[0] = strdup("1");
...

如果你这样做,请不要在完成后忘记释放它们,因为strdup()会分配内存,例如

// free one pointer from the array:
free(str[0]);
// or if you have allocated to every value in the array:
size_t arr_len = sizeof(str) / sizeof(*str);
for (size_t n = 0; n < arr_len; ++n)
    free(str[n]);

答案 1 :(得分:1)

viewWillTransitionToSize返回一个指向char的指针。如果要将该指针存储在数组中,则需要一个指针数组,如此

strdup

答案 2 :(得分:1)

如果要复制整个字符串内容,可以使用strcpy,但请注意,它会复制以空字符结尾的字符串。需要有最后一个空符号的位置。因此,字符串数组的长度必须至少为2(char str[3][2])才能复制像“1”这样的字符串。