将字符串复制到指针似乎不起作用

时间:2013-03-17 10:23:53

标签: c string pointers copy

我有Node

的结构
typedef struct Node{
  unsigned int length;
  char *string;
} Node;

此操作接受指向Node的指针并尝试附加提供的字符串:

int setString(Node *node, char *string){

  char *newString;
  if(!isString(node) || !string) return 0;

  newString = (char *) malloc(strlen(string)+1);
  if(!newString) return 0;

  /*THIS PART FAILS*/
  strncpy(newString,string,sizeof(newString));

  node->string = newString;
  node->length = strlen(newString);

  /*Which can be seen here*/
  printf("Original String: %s\n",string);
  printf("Copied String: %s\n",node->string);

  return 1;
}

在指定的部分,我可以看到原始字符串似乎没有被复制到node->string。它复制了前两个字符,然后是垃圾或空白。

我检查了这篇文章,我正在关注第三个案例,这似乎适用于OP。也许我忽略了一些东西,但是无法弄清楚

4 个答案:

答案 0 :(得分:5)

strncpy(newString,string,sizeof(newString));

在这种情况下sizeof没有做你想做的事。通过您分配的尺寸或不要使用strncpy 。如果您遵循自己的逻辑,那么您已经信任string ,因为您在拨打strlen时已经使用了malloc

因此,您可以安全地使用strcpy


如果你愿意有点不便携,你就可以逃脱:

newString = strdup(string);

答案 1 :(得分:1)

您的sizeof()调用导致您的问题:

sizeof(newString);

newString是一个指向字符的指针:

char *newString;

字符指针使用(通常)2,4或8个字节(取决于机器架构)。 所以很明显,你只复制了前2/4/8个字节。使用strlen(string) + 1表示要复制的字符数。

或者你可以使用strcpy()。这将处理终止空字节。由于您使用malloc()正确调用strlen,因此strcpy()无法导致溢出。

答案 2 :(得分:1)

您无法使用sizeof()来确定字符串长度。

您必须使用strlen(string)功能。

此外,您需要在复制的符号后设置\0以终止字符串。

答案 3 :(得分:0)

不确定,但请直接尝试:

strncpy(node->string,string,strlen(newString));

将长度函数更改为 strlen

(我试图将代码中的更改设为粗体)