c - 如何打印字符**

标签 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("%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;
}

最佳答案

问题一

线路有问题:

        **(all_lines+i) = *buffer;

这只是从 buffer 中复制了一个字符。因此,all_lines 中的所有字符串都不是空终止的。

你应该替换这些行:

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

通过

        all_lines[i] = buffer;

问题2

我看到的下一个问题是:

        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);

因为您将在下一次迭代中使用 all_lines[1]。该行需要是:

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

关于c - 如何打印字符**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40140054/

相关文章:

c - 将指向同一 union 成员​​的两个指针传递给函数是否违反严格的别名规则?

通过名称和函数指针在 C 中调用函数

c - 如何不使指向数组 [0] 的指针在每个循环中修改数组 [0]

c - 如何从 C 中的现有变量创建位域

c++ - 删除时无效指针崩溃,但指针不同

c++ - 这里的typedef有什么用?

c - 在 OpenCL 和映射缓冲区中使用多个命令队列。我会遇到冲突吗?

c - 以指针为参数的数组函数

python - Cython函数内存泄漏

c++ - 在控制台应用程序中检测按键?