2015-05-20 78 views
1

我想要的是創建具有特定lenght一個新的字符串的函數。 這是代碼:問題與字符串創建Ç

char* newString(int lenght){ 

    char* newstring =(char*)((calloc(lenght, sizeof(char)))); 
    newstring[lenght] = '\0'; 
    return newstring; 
} 

我使用了這種方式:

char* string = newString(10); 

我的問題是,當我這樣做:

printf("String lenght %lu \n",strlen(string)); 

我得到0,但我不知道理解爲什麼。 我是新手與C 感謝您的時間

+1

因爲'calloc'零初始化您的數組,並且您從不填充任何東西。此外,它的拼寫「長度」 –

+1

...你正在使用'T [lenght] =「\ 0''不分,從而調用不確定的行爲超出分配給您的長度。 C中的數組是零基索引的。含義'0 ...(lenght-1)'是索引的允許範圍。 – WhozCraig

+0

't [length] ='\ 0';'是一個超出限制的寫入。 – Xaqq

回答

0

如果長度不包括空終止,那麼你應該設置T [長度 - 1]爲零,或尺寸爲長或者釋放calloc + 1

+1

如果發佈一個答案,也許認爲回答這個問題的問題貼:爲什麼'strlen的(串)''報告0'。 – WhozCraig

4

strlen返回第一個'\0'之前的字符數。如果您使用:

char s[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
int len = strlen(s); // len will be zero. 
1

這裏有幾個問題。首先是你在終止t(並且我不確定實際引用了什麼),在索引「length」處有一個空終止符,它將比數組的大小大1。所以你正在訪問一些隨機blob的內存。其次是不恰當地使用calloc。我想你想要更多的東西一樣:

char* new_string(int length) { 
    char* new_string; 
    new_string = malloc(sizeof(char) * length); 
    memset(new_string, 0, length); 
    new_string[length-1] = '\0'; 
    return new_string; 
} 

strlen的在你的例子返回0,因爲它的空終止,這發生在你的實現是0之前計數的字符。

+0

爲什麼calloc函數不好? –

+1

OP使用'calloc'是正確的。你做同樣的事情,只是更多的代碼行。從技術上講,這一切功能,所要做的就是'回報釋放calloc(長度的sizeof(字符));' –

+0

我知道釋放calloc功能將內存(除分配內存),該函數memset的做同樣的事情?有什麼變化? –

0

strlen的字符計數的數目在c串,直到它看到「\ 0」(字符串的末尾),以便你的字符串與初始化「\ 0」其長度實際上爲0變化這個值到另一個喜歡。

memcpy(string, "good things", 10); 
    printf("%d", strlen(string));