2017-09-24 81 views
0

這裏是我的代碼的一部分。我將我的文本文件的一些行放入array1中,我選擇了數字28,但它必須是我存儲的每行的不同數量。我需要爲每個行的實際長度分配空間,我不知道如何找到每個字符串的長度,因爲的sizeof(STR)總是給我100爲字符串的實際長度分配足夠的空間

while (fgets(str, sizeof(char)*100, fp) != NULL) { 

    array1[j] = (char *)malloc(sizeof(char)*28); 
    strcpy(array1[j], str); 
    j++; 

//其餘代碼 的}

+2

你想'''strlen',但不要忘記添加一個空終止符。 –

+0

你可以使用'stdlib.h'的'strlen()'函數 – krpra

+2

另外,請把sizeof(char)* 100'改爲'sizeof(str)'。假設'str'是一個數組,而不是傳遞給函數的指針(或數組)。這是發佈不完整代碼的麻煩。 –

回答

1

分配的字符串

演員在(char *)malloc(sizeof(char)*28);不需要(char *)的實際長度足夠的空間。
使用strlen(str)@M Oehm查找長度。此長度不包括'\0'
找到大小需要加1到長度。
分配爲字符串大小,而不是長度
最好使用size_t進行字符串長度/大小計算。 int可能不足。


的問題是這樣寫一個字符串複製功能。研究通用的strdup()函數。

char *s96_strdup(const char *s) { 
    size_t length = strlen(s); // Get the string length = does not include the \0 
    size_t size = length + 1; 
    char *new_string = malloc(size); 

    // Was this succesful? 
    if (new_string) { 
    memcpy(new_string, s, size); // copy 
    } 

    return new_string; 
} 

用法。 fgets()讀取,其通常包括'\n'

char str[100]; 
while (j < JMAX && fgets(str, sizeof str, fp) != NULL) { 
    array1[j] = s96_strdup(str); 
    j++; 
} 

記住最終會爲每個分配的字符串調用free(array1[j]

+0

請注意,在分配給array1 [j]之前,您應該檢查's96_strdup'的返回值,否則,您可以將'NULL'作爲價值(隨後的「免費」可能不欣賞)。也許'char * tmp = s96_strdup(str);'然後'if(tmp){array1 [j] = tmp; J ++; }'(附註:'strdup'函數名稱的有趣選擇':)' –

+0

@ DavidC.Rankin'free(NULL);'「沒有問題...如果ptr是空指針,則不會發生任何操作。 。「C11§7.22.3.32 – chux

相關問題