【发布时间】:2020-02-26 19:23:44
【问题描述】:
我正在尝试捕获通过 stdin 流输入的所有字符,但 EOF 除外。我想输入一个多行文本:每行末尾有\n。
int getline(char s[])
{
printf("Call-getline()\n");
int c;
int idx=0;
while((c=getchar()) != EOF)
{
s[idx++] = c;
}
printf("\n-EOF found--\n");
s[idx] = '\0';
return idx;
}
我不知道如何摆脱按回车键时得到的\n,我想知道shif+enter 与enter alone 是否有任何区别。我阅读了它在 Microsoft Word 中的作用:新段落与换行符。
【问题讨论】:
-
这个答案:Removing trailing newline character from fgets() input 展示了如何从字符串中删除最后的换行符。您没有使用
fgets并不重要,并且当那里没有换行符时是安全的。那就是s[strcspn(s, "\n")] = 0; -
是的,这是我的错误。应该只有
s[idx] = '\0',因为当循环退出时,idx已经加一。 -
@WeatherVane ,
s[--idx] = '\0'不会一直工作,因为当您按下enter时,代码块控制台将始终在任何输入流中推送换行符? -
这会覆盖
enter(换行符)。但如果它不存在,它要么覆盖您想要的字符,要么如果没有任何输入,则索引s[-1],这很糟糕。但我所指的评论已被删除,尽管它正确识别出s[++idx] = '\0';的问题 -
您的
getline函数不安全,因为它不检查数组边界。