2017-09-24 95 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

相关问题