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