假设我有以下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
答案 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
为止。