如何在没有前面的换行符的情况下刺激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 

将我的评论转换为答案:

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

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

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

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

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

 line[i++] = c; 

应该:

 line[i] = '\0'; 

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

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

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