1

假设我有以下 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: 

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

当我做我的练习时,我真的面临着额外的 \n 一些麻烦。

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

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

2 回答 2

2

将我的评论转换为答案:

在哪个平台上?在 Unix 和衍生产品上,您会键入两次 EOF '字符'——但通常control-D不是control-Z. 这也可能适用于 Windows;我不知道,但值得一试。

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

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

于 2013-01-07T16:14:42.630 回答
1

然后避免在循环中存储换行符。并不是说您被迫存储所有字符而不管其价值如何。:)

此外,您没有正确终止字符串。这个:

line[i++] = c;

应该:

line[i] = '\0';

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

一般来说,你最好使用fgets().

编辑:我可能错过了重点,但似乎整个焦点EOF都在......被误导了,如果你只想读一行。行通常不以 结尾EOF,而是以\n. 因此,该函数可能应该只存储字符,直到遇到或 EOF\n

于 2013-01-07T16:03:01.177 回答