以下是来自Kernighan&里奇的“The C Programming Language”:
int getline(char s[], int lim)
{
int c, i = 0;
while (--lim > 0; && (c=getchar()) !=EOF && c !='\n')
{
s[i++] = c;
}
if (c =='\n')
{
s[i++] = c;
}
s[i] = '\0';
return i;
}
为什么我们应该检查c != '\n'
,尽管我们之后使用s[i++] = c
?
答案 0 :(得分:3)
函数从标准输入中读取字符,直到找到EOF或换行符。
第二次检查确保将唯一的换行符放入char数组中。 EOF不应出现在正确的c弦中。此外,如果字符不是换行符,则意味着我们可能已经填充了我们的c字符串,在这种情况下,我们不应该再添加任何字符。
注意我们仍然附加'\ 0'。我们已经确保在我们的c字符串中还有一个字符的空间,因为我们使用预先修复的减量,它在比较之前进行评估。
答案 1 :(得分:1)
比较是为了确保readline在遇到换行符('\ n')时终止。在它执行的迭代中,它终止而不向字符串添加换行符,因此之后的语句确保字符串始终以换行符终止,即使已达到其他终止条件之一。
答案 2 :(得分:1)
代码中存在错误。
如果s的大小是N个字节,并且用户键入换行符作为第(N-1)个字符,则第N个字符将变为'\ n'和第(N + 1)个字符(不是已分配)将成为'\ 0'。
答案 3 :(得分:0)
你这样做只是为了在新行上退出while循环。否则你必须在身体和使用休息时检查它。
答案 4 :(得分:0)
即使它不是输入的结尾,也可以确保您在行尾停止。然后,如果有换行符,则将\ n添加到行尾,并再次增加一次以避免用\ 0覆盖它。
答案 5 :(得分:0)
int getline(char s[], int lim)
{
int c, i;
i=0;
/* While staying withing limit and there is a char in stdin and it's not new line sign */
while (--lim > 0; && (c=getchar()) !=EOF && c !='\n')
/* Store char at the current position in array, advance current pos by one */
s[i++] = c;
/* If While loop stopped on new-line, store it in array, advance current pos by one */
if (c =='\n')
s[i++] = c;
/* finally terminate string with \0 */
s[i] = '\0';
return i;
}
答案 6 :(得分:0)
我不确定我是否理解这个问题。 c !='\n'
用于在行结束(换行)时停止读取行。否则,即使它在之前结束,我们也会一直读到它。如果已到达换行符,则不会发生while循环中的第一个s[i++] = c;
。这就是为什么之后有特殊测试和另一个s[i++] = c;
,以防它是一个打破循环的换行。
答案 7 :(得分:0)
没有回答你的问题,但我还是会写一些评论:
我不记得所有K& R规则,但如果lim等于1,您列出的功能将失败。然后你不会运行离开c unintialised的循环,但你仍然会在if(c =='\ n')检查中使用该变量。
while(--lm> 0; ...)事情也不会通过编译器。除掉 ';'确实如此。