1

*注意:我使用的是 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'从未收到命令一样。如果此时我再次按回车,它会显示以下内容:

EOF 怪异

一个多小时以来,我一直在修补和调试这段代码和它的小变化,似乎找不到任何问题。理论上,如果我输入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与其他值混合导致意外行为的唯一实例。

4

2 回答 2

4
于 2013-06-18T06:47:46.610 回答
0

It is the normal behaviour of getchar..

getchar() is a standard function and requires you to press *ENTER* to get the input

Many compilers/platforms support the non-standard getch() that does not require ENTER.

EOF is not a character. The EOF is a macro that getchar() returns when it reaches the end of input or encounters some kind of error

于 2013-06-18T06:48:28.597 回答