我已经使用strfry编写了一个字符串变位词程序,它在默认标准输入下运行良好,但在使用stdio重定向函数时崩溃(在结尾处出现段错误):
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/mman.h"
int main(int argc,char *argv[]) {
FILE *fryend=stdin;
if (argc==1) goto mainloop;
if (argc>1) fryend=fopen(argv[1],"r") ? fryend : stdin;
mainloop:;
char *buf=malloc(4096);
while (!ferror(fryend)) {
memset(buf,0,4096);
strfry(fgets(buf,4095,fryend));
fputs(buf,stdout);
}
free(buf);
if (fryend!=stdin) fclose(fryend);
return 0;
}
这里有什么问题吗?使用了GNU libc/GCC。通过valgrind运行,未检测到内存泄漏。
fgets
调用总是在stdin
上工作。如果fryend
是一个文件,你应该fclose
它,否则 Valgrind 会抱怨。我不确定strfry
在NULL
输入时的行为。我认为将fgets
和strfry
调用分开并检查NULL
更加清晰。 - M Oehmfopen
失败后悄无声息地回退到stdin
并不是一个好的设计。 - M Oehmrev
一样,因此回退到stdin
是合理的。 - Erkin Alp Güneyfgets(buf,4095,stdin)
更改为fgets(buf,4095,fryend)
应该会有所不同.... - wimh