试图使用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
答案 0 :(得分:1)
您的问题不在打印。在读取和存储中。
sizeof(char) * strlen(line)
必须为sizeof(char) * (strlen(line) + 1)
(您没有为NULL终止符分配空间)。实际上,(strlen(line) + 1)
就足够了(请参阅@ user3629249的注释),甚至(len + 1)
就足够了(因为len
拥有读取字符串的长度)。
input[i] = line;
不会创建字符串的副本。您必须使用strcpy(input[i], line);
。
free(line)
。