簡體   English   中英

將字符串復制到指針似乎不起作用

[英]Copying a string to a pointer doesn't seem to work

我有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。 也許我忽略了一些東西,但只是想不通

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

在這種情況下, sizeof不能滿足您的需求。 傳遞您分配的大小,或者不使用strncpy 如果您遵循自己的邏輯,那么您就已經信任string 因為調用mallocstring strlen

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


如果您願意去一點不可攜帶的東西,那么您可以擺脫:

newString = strdup(string);

您的sizeof()調用引起了您的問題:

sizeof(newString);

newString是指向字符的指針,此處聲明:

char *newString;

字符指針通常使用2,4或8個字節(取決於機器體系結構)。 很明顯,您僅復制了前2/4/8個字節。 使用strlen(string) + 1表示要復制的字符數。

或者,您可以只使用strcpy() 這將處理終止的空字節。 由於您使用strlen正確調用了malloc() ,因此沒有機會導致strcpy()溢出。

您不能使用sizeof()來確定字符串長度。

您必須改為使用strlen(string)函數。

同樣,您需要在復制符號后將\\0設置為終止字符串。

不確定,但是請直接嘗試以下方法:

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

將長度函數更改為strlen

(我試圖將代碼更改為粗體)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM