循环时无法在getline()外部打印char **

时间:2018-10-17 02:45:40

标签: c string pointers malloc double-pointer

试图使用getline()从命令行参数读取文件并将其存储到char **中,但是当我尝试像使用printf()一样访问内部数据时,它什么都不打印。尽管printf()在每个getline()之后的while循环内都能正常工作。

非常感谢您的帮助!

int main (int argc, char* argv[])
{
    //open file
    FILE *stream = NULL;
    char *line = NULL;
    size_t len = 0;
    ssize_t nread;
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s <file>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    stream = fopen(argv[1], "r");
    if (stream == NULL)
    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    //read file line by line
    char ** input = NULL;
    int i = 0;
    int j = 0;
    while ((nread = getline(&line, &len, stream)) != -1)
    {
        j++;
        input = (char **)realloc(input, sizeof(char*) * j);
        input[i] = (char *)malloc(sizeof(char) * strlen(line));
        input[i] = line;

        //print each line (PRINTS FINE)
        printf("%s",input[i]);
        i++;
    }

    //print each line outside of while loop (PRINTS NOTHING)
    for (int z = 0; z < j ; z++)
    {
        printf("%s",input[z]);
    }
}

欢迎尝试使用任何这样的.txt文件

./a.out input.txt

1 个答案:

答案 0 :(得分:1)

您的问题不在打印。在读取和存储中。

  1. sizeof(char) * strlen(line)必须为sizeof(char) * (strlen(line) + 1)(您没有为NULL终止符分配空间)。实际上,(strlen(line) + 1)就足够了(请参阅@ user3629249的注释),甚至(len + 1)就足够了(因为len拥有读取字符串的长度)。

  2. input[i] = line;不会创建字符串的副本。您必须使用strcpy(input[i], line);

  3. 最后,您必须最后free(line)