尝试使用 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
您的问题不是打印。它在阅读和存储中。
-
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)
。