将行从文本文件保存到动态字符串数组

时间:2016-11-12 09:31:57

标签: c dynamic-memory-allocation

这是我与C的第一年,所以我有点失落。

我有这个功能:

void read(char** lines){

FILE *fpointer = fopen("input1.txt","r");
char *p_input = (char*) malloc(sizeof(char)*200);
int i,len;
i=0;

lines =  malloc(sizeof(char*));


while( fgets(p_input,200,fpointer) ){ 

    len = strlen(p_input);
    char temp[len];
    strcpy(temp,p_input);
    lines[i] = temp;
    i++;

}   

}

并在主要:

int main(){
char **lines;
read(lines);

return 0;}

当我尝试从数组中打印内容时,我会遇到错误并且代码会停止,例如:

printf("%s\n",lines[0]);

你能告诉我出了什么问题。

1 个答案:

答案 0 :(得分:0)

lines =  malloc(sizeof(char*));
...
lines[i] = temp;

这是错误的,你没有足够的空间来指向char的指针数组(你需要知道要保留的行数)

更改为

char **read(void) {
    size_t n = file_lines;
    char **lines =  malloc(sizeof(char*) * n);
    ...
    return lines;
}

int main(void) {
    char **lines;

    lines = read();
    return 0;
}

如果你不知道前面的行数,你可以在realloc循环的每次迭代中使用while

char **read(void) {
    ...
    char **lines =  NULL;
    char **tmp;
    ...
    while (fgets(p_input,200,fpointer)) { 
        ...
        tmp = realloc(lines, sizeof(char *) * (i + 1));
        if (tmp != NULL) {
            lines = tmp;
        } else {
            return NULL;
        }
        lines[i] = temp;
        i++;
    }   
    return lines;
}

int main(void) {
    char **lines;

    lines = read();
    if (lines == NULL) {
        perror("read");
        exit(EXIT_FAILURE);
    }
    return 0;
}