如何在没有前面的换行符的情况下刺激EOF

时间:2013-01-07 16:00:06

标签: c eof

假设我有以下C代码:

int getLine (char line[])
{
    int c, i=0;
    while( (c=getchar()) != EOF )
           line[i++]=c;
    line[i++] = c;
    return i;
}

>> Enter: 007
>> ^Z
>> Output: 

如果我们仔细观察上面输出的方式,我会在刺激EOF之前按下Enter。这意味着,字符串的长度为4而不是3(不包括EOF)。

当我进行练习时,我真的面临着一些额外的麻烦。

如何在没有换行的情况下刺激EOF?它有可能吗?

>> Enter: 007^Z
>> ^Z
>> Output: length=6

2 个答案:

答案 0 :(得分:2)

将我的评论转换为答案:

  

在哪个平台上?在Unix和衍生物上,你可以输入两次EOF'字符' - 通常是 control-D 而不是 control-Z 。这也适用于Windows;我不知道,但值得一试。

(回复评论确认该平台是Windows。)

  

在Unix上, control-D 使该行上的数据可用   程序。第一个 control-D 给出了你已输入的内容;该   第二个给它读零字节,这是EOF的指示。

答案 1 :(得分:1)

然后避免在循环中存储换行符。这并不是说你被迫存放所有角色而不管价值如何。 :)

另外,您没有正确终止字符串。这样:

line[i++] = c;

应该是:

line[i] = '\0';

当然,它对缓冲区溢出很敏感。

一般情况下,您最好使用fgets()

编辑:我可能会忽略这一点,但似乎是EOF的整个焦点都被误导了,如果你想做的就是读一行。行通常不会以EOF终止,而是\n。所以函数应该只存储字符,直到遇到 EOF\n为止。