我已经使用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'是更清晰的。 – 2014-12-07 09:18:12
作为一个方面说明:在我看来,让一个失败的fopen无声地回落到stdin并不是一个好设计。 – 2014-12-07 09:19:33
@M Oehm:这是一个stdio过滤器,就像'rev'一样,所以回退到'stdin'是合理的。 – 2014-12-07 09:37:52