我已经写了一个程序来使用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。您应该使用此返回值,而不是调用ferrorfeof来控制循环。您还应该注意不要将NULL指针传递给字符串函数。他们可能会优雅地处理此问题,但通常不会。

因此,您的循环应如下所示:

while (fgets(buf, 4096, fryend)) {
    strfry(buf);
    fputs(buf, stdout);
}

我扔掉了memset,因为fgets的结果是空终止的,并且不会溢出缓冲区,因此您可以传递完整的4096字节长度。

08-28 07:45