大多数使用feof()
是一个错误 - 这个程序在这个主循环中完美地展示了它:
char temp[1048576];
do {
if (!strcmp(argv[1], "serifb"))
transpose(fgets(temp, 1048576, stdin), 119808 - 'A', 119834 - 'a', 120782 - '0');
else if (!strcmp(argv[1], "serifi"))
transpose(fgets(temp, 1048576, stdin), 119860 - 'A', 119886 - 'a', 0);
else if (!strcmp(argv[1], "serifbi"))
transpose(fgets(temp, 1048576, stdin), 119912 - 'A', 119938 - 'a', 0);
else if (!strcmp(argv[1], "sans"))
transpose(fgets(temp, 1048576, stdin), 120224 - 'A', 120250 - 'a', 120802 - '0');
else if (!strcmp(argv[1], "sansb"))
transpose(fgets(temp, 1048576, stdin), 120276 - 'A', 120302 - 'a', 120812 - '0');
else if (!strcmp(argv[1], "sansi"))
transpose(fgets(temp, 1048576, stdin), 120328 - 'A', 120354 - 'a', 0);
else if (!strcmp(argv[1], "sansbi"))
transpose(fgets(temp, 1048576, stdin), 120380 - 'A', 120406 - 'a', 0);
else if (!strcmp(argv[1], "mono"))
transpose(fgets(temp, 1048576, stdin), 120432 - 'A', 120458 - 'a', 120822 - '0');
else if (!strcmp(argv[1], "fullwidth"))
transposeBlock(fgets(temp, 1048576, stdin), '!', '~', 65281 - '!');
else return help();
} while(!feof(stdin));
在文件末尾,fgets()
将返回NULL
,然后下一次调用feof()
将返回 true。所以正确的方法是测试你的输入函数的返回值——因为无论如何你都在做那个测试,所以没有必要调用feof()
(除非你想区分文件错误和文件结尾)。
char temp[1048576];
while (fgets(temp, sizeof temp, stdin) != NULL) {
if (!strcmp(argv[1], "serifb"))
transpose(temp, 119808 - 'A', 119834 - 'a', 120782 - '0');
else if (!strcmp(argv[1], "serifi"))
transpose(temp, 119860 - 'A', 119886 - 'a', 0);
else if (!strcmp(argv[1], "serifbi"))
transpose(temp, 119912 - 'A', 119938 - 'a', 0);
else if (!strcmp(argv[1], "sans"))
transpose(temp, 120224 - 'A', 120250 - 'a', 120802 - '0');
else if (!strcmp(argv[1], "sansb"))
transpose(temp, 120276 - 'A', 120302 - 'a', 120812 - '0');
else if (!strcmp(argv[1], "sansi"))
transpose(temp, 120328 - 'A', 120354 - 'a', 0);
else if (!strcmp(argv[1], "sansbi"))
transpose(temp, 120380 - 'A', 120406 - 'a', 0);
else if (!strcmp(argv[1], "mono"))
transpose(temp, 120432 - 'A', 120458 - 'a', 120822 - '0');
else if (!strcmp(argv[1], "fullwidth"))
transposeBlock(temp, '!', '~', 65281 - '!');
else return help();
}