Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何打印字符**_C_Pointers - Fatal编程技术网

C 如何打印字符**

C 如何打印字符**,c,pointers,C,Pointers,我有一个方法可以读取文件并将行分配给char**。但当我试图打印它的第一个元素时,它会打印随机字符。可能出了什么问题 int main() { char **lines_from_file = read_from_file(file_name); print_first_line(lines_from_file); return 0; } void print_first_line(char **command_lines) { printf("

我有一个方法可以读取文件并将行分配给char**。但当我试图打印它的第一个元素时,它会打印随机字符。可能出了什么问题

int main()
{
     char **lines_from_file = read_from_file(file_name);
     print_first_line(lines_from_file);
     return 0;
}

void print_first_line(char **command_lines)
{
    printf("%s", command_lines[0]);
}

char** read_from_file(char *file_name)
{
    int size;
    int c;
    char *buffer;
    char** all_lines= (char**)malloc(sizeof(char*));

    FILE *f = fopen(file_name, "r");
    if(f)
    {
        int i=0;
        do   // read all lines in file
        {
            size = 0;
            buffer = (char *)malloc(size+1);
            do  // read one line
            {
                c = fgetc(f);
                if(c != EOF) buffer[size++] = (char)c;
                buffer = (char*)realloc(buffer, size+1);
            }
            while(c != EOF && c != '\n');
                
            *(all_lines+i) = (char*)malloc(sizeof(buffer));
            **(all_lines+i) = *buffer;
            i++;
            all_lines = (char**)realloc(all_lines, sizeof(char*) * i);

        }
        while(c != EOF);
        fclose(f);
    }
    free(buffer);
    return all_lines;
}

问题1

问题在于:

        **(all_lines+i) = *buffer;
        all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
它只从
缓冲区
复制一个字符。因此,
所有_行
中的字符串都不以空结尾

您应该替换以下行:

        *(all_lines+i) = (char*)malloc(sizeof(buffer));
        **(all_lines+i) = *buffer;

问题2

我看到的下一个问题是:

        **(all_lines+i) = *buffer;
        all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
在循环的第一次迭代中,
i
为1。因此,该行与:

        all_lines = (char**)realloc(all_lines, sizeof(char*));
这不是你想要的。你想要

        all_lines = (char**)realloc(all_lines, sizeof(char*) * 2);
因为您将在下一次迭代中使用
所有\u行[1]
。这条线需要:

        all_lines = (char**)realloc(all_lines, sizeof(char*) * (i+1));

问题1

问题在于:

        **(all_lines+i) = *buffer;
        all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
它只从
缓冲区
复制一个字符。因此,
所有_行
中的字符串都不以空结尾

您应该替换以下行:

        *(all_lines+i) = (char*)malloc(sizeof(buffer));
        **(all_lines+i) = *buffer;

问题2

我看到的下一个问题是:

        **(all_lines+i) = *buffer;
        all_lines = (char**)realloc(all_lines, sizeof(char*) * i);
在循环的第一次迭代中,
i
为1。因此,该行与:

        all_lines = (char**)realloc(all_lines, sizeof(char*));
这不是你想要的。你想要

        all_lines = (char**)realloc(all_lines, sizeof(char*) * 2);
因为您将在下一次迭代中使用
所有\u行[1]
。这条线需要:

        all_lines = (char**)realloc(all_lines, sizeof(char*) * (i+1));

sizeof(buffer)
没有达到您期望的效果;在那里使用您的
size
变量<代码>**(所有_行+i)=*缓冲区只复制一个
字符
。存在大量边界条件错误。试着坚持这种模式:
while(read_it(the_data)==ok){process_it(the_data);}
。避免做。。。虽然,但它很少适用。如果在文件读取循环中嵌套了行读取循环,则将前者设为函数。
sizeof(buffer)
没有达到预期效果;在那里使用您的
size
变量<代码>**(所有_行+i)=*缓冲区只复制一个
字符
。存在大量边界条件错误。试着坚持这种模式:
while(read_it(the_data)==ok){process_it(the_data);}
。避免做。。。虽然,但它很少适用。如果在文件读取循环中嵌套了一个行读取循环,那么将前者作为一个函数。。我像你说的那样修改了代码,它正确地打印了第一行。但现在我无法打印第二行,我想知道为什么?第三个问题是我正在释放缓冲区的行,因为它实际上指向最后一行。我需要在完成工作后有空。很好,我可以继续前进!非常感谢。。我像你说的那样修改了代码,它正确地打印了第一行。但现在我无法打印第二行,我想知道为什么?第三个问题是我正在释放缓冲区的行,因为它实际上指向最后一行。我需要在完成工作后有空。很好,我可以继续前进!谢谢