为什么我们使用额外的表达?

时间:2008-09-16 12:58:08

标签: c

以下是来自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

8 个答案:

答案 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; ...)事情也不会通过编译器。除掉 ';'确实如此。