我已经写了一个程序来使用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
返回NULL
。您应该使用此返回值,而不是调用ferror
或feof
来控制循环。您还应该注意不要将NULL
指针传递给字符串函数。他们可能会优雅地处理此问题,但通常不会。
因此,您的循环应如下所示:
while (fgets(buf, 4096, fryend)) {
strfry(buf);
fputs(buf, stdout);
}
我扔掉了
memset
,因为fgets
的结果是空终止的,并且不会溢出缓冲区,因此您可以传递完整的4096字节长度。