*注意:我使用的是 Windows,所以 EOF 对我来说是 ctrl + Z。
一段时间以来,我注意到一个 EOF 输入在隔离时的行为似乎与伴随其他输入时的行为不同。例如,^Z
(命令提示符中的 Windows 的 EOF 命令)并且a^Z
似乎在以下代码中导致不同的行为:
#include <stdio.h>
#define MAX 1000
int getline(char s[]);
main() {
int line;
char arr[MAX];
while( (line = getline(arr)) != EOF)
printf("%s",arr);
system("Pause");
return 0;
}
int getline(char s[])
{
int c, i = 0;
while ((c = getchar()) != EOF && c != '\n') {
s[i++] = c;
}
if (c == '\n') {
s[i++] = c;
}
else
return EOF;
s[i] = '\0';
return 1;
}
如果我^Z
在命令提示符下输入 + enter,程序会按预期跳转到。system("Pause");
但是,如果我输入abc^Z
+ enter,则没有任何反应,就好像 EOF 被忽略并且'\n'
从未收到命令一样。如果此时我再次按回车,它会显示以下内容:
一个多小时以来,我一直在修补和调试这段代码和它的小变化,似乎找不到任何问题。理论上,如果我输入abc^Z
+回车,我希望输入被解释为abcEOF\n
,这将给出:
s[0] = 'a'
s[1] = 'b'
s[2] = 'c'
i = 3 when loop breaks from c = EOF
if (c == '\n') skipped since c = EOF
leads to else -> return EOF
in main(), line = EOF since that is what the function getline returned
while loop breaks because of above
system("Pause"); follows
我忽略的代码是否有问题,或者我应该注意的 EOF 或命令提示符有什么问题?我几乎可以肯定这不是^Z
与其他值混合导致意外行为的唯一实例。