2013-03-17 62 views
-1

我有接受一個指向Node並嘗試附加提供的字符串的Node複製一個字符串的指針似乎不工作

typedef struct Node{ 
    unsigned int length; 
    char *string; 
} 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。也許我忽略了一些東西,但就是無法找出其中

回答

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

在此背景下sizeof不會做你想做的。通過您分配的尺寸或不要使用strncpy。如果您遵循自己的邏輯,您已經信任string,因爲您在撥打malloc時已將其號碼爲strlen

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


如果你願意走一點不可移植,你可以逃脫:

newString = strdup(string); 
+0

另外,在問這個問題之前,你做了哪些研究?有一個[c-faq.com常見問題](http://c-faq.com/malloc/sizeof.html)回答了這個問題!如果你不得不向我們提出這個問題,那麼我建議你的學習方法對你來說效果不佳。 – Sebivor 2013-03-17 10:59:52

+0

@modifiablelvalue對不起我的C,我試圖跨越JS和C之間的這種差距,特別是內存分配。謝謝你的參考:) – Joseph 2013-03-17 11:02:43

+1

@JosephtheDreamer幸運的是,一隻猴子可以通過在鍵盤上搗成臉來學習Javascript。以這種方式學習C是不明智的,因爲最初似乎起作用的那個可能會受到不可移植和*未定義行爲的困擾。我建議讀一本書。 – Sebivor 2013-03-17 11:06:32

1

你的sizeof()調用時造成您的問題:

sizeof(newString); 

newString是一個指向這裏的字符的指針:

char *newString; 

字符指針使用(通常)2,4或8字節(取決於機器體系結構)。 所以很明顯,你只是複製了第一個2/4/8字節。使用strlen(string) + 1作爲要複製的字符數。

或者您可以使用strcpy()。這將處理終止空字節。由於您正在使用strlen正確呼叫malloc(),因此不會引起與strcpy()的溢出。

1

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

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

您還需要在複製符號後設置\0來終止字符串。

+0

Yeh ...如果可以的話,strncpy會將固定寬度字段終止爲字符串,在這種情況下,它可以。 – Sebivor 2013-03-18 03:48:55

0

不知道,但直接在此嘗試:

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

改變長度的功能strlen的

(我試圖使代碼中的變化變爲粗體)

+0

這也行不通。 'newString'被聲明爲一個**指針**給一個特徵。 'sizeof()'將返回該指針的大小。 – flyingOwl 2013-03-17 10:31:30

+0

我同意,如何改變長度函數也。 – johnnaras 2013-03-17 10:35:02

+0

@flyingOwl如果sizeof *運算符*返回*,我會感到非常沮喪。 – Sebivor 2013-03-18 03:53:11