[英]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
因為調用malloc
時string
很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.