我有以下程序:
/* a.c */
#include <stdio.h>
int
main(int argc, char* argv[]){
size_t size=0;
char* lineptr;
while(getline(&lineptr, &size, stdin)){
fprintf(stderr, "line = %s\n", lineptr);
if(lineptr){
free(lineptr);
lineptr = NULL;
}
}
return 0;
}
我重定向了shell命令的输出&#34; ls&#34;使用中的这个程序 以下一行:
ls | ./a.out
预期产量:
程序应该打印当前目录中所有文件的名称
并终止。
实际输出:
程序打印所有文件的名称但不终止,
相反,它无限循环并无限地打印最后一个条目。
谢谢
答案 0 :(得分:4)
GNU的getline
函数在文件结束(或错误)时返回-1
。使用
while(-1 != getline(&lineptr, &size, stdin))
...并在第一次调用lineptr
之前将NULL
设置为getline
。
此外,在循环的每次迭代中都没有free
指针;您可以在结尾处重复使用前一个指针和free
:
size_t size = 0;
char* lineptr = NULL;
while(-1 != getline(&lineptr, &size, stdin)){
fprintf(stderr, "line = %s", lineptr);
}
free(lineptr);
getline
会根据需要在内部使用realloc
。请注意,您必须确保在lineptr
的调用之间不更改size
和getline
才能使其生效(尽管您可以更改lineptr
点的字符串)