【发布时间】:2018-10-17 02:45:40
【问题描述】:
尝试使用 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
【问题讨论】:
-
已编辑以增加 j,仍然不打印任何内容
-
OT:当调用任何堆分配函数时:
malloccallocrealloc, 1) 始终检查 (!=NULL) 返回值以确保操作成功。 2)返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等 -
input[i] = line;没有意义,你删除了你之前的分配! -
关于:
input[i] = line;在下一次调用getline()之后,char * 将指向不再属于您的程序的内存。建议:strcpy( input[i], line); -
感谢您的提示!使用 strcpy(input[i], line) 似乎可以解决问题!
标签: c string pointers malloc double-pointer