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

时间:2020-03-05 18:55:50  来源:igfitidea点击:

这是Kernighan&Ritchie的" 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] = '
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 ##代码## */
   s[i] = '##代码##';
   return i;
}
'; return i; }

尽管之后我们使用s [i ++] = c,为什么还要检查c!='\ n'

解决方案

回答

我们只需要退出新行的while循环即可。否则,我们将不得不在身体检查时使用并休息一下。

回答

进行比较是为了确保readline在遇到换行符(" \ n")时终止。在执行此操作的迭代中,它终止时没有在字符串中添加换行符,因此,即使达到了其他终止条件之一,该语句也可确保该字符串始终以换行符终止。

回答

这样可以确保即使不是输入的结尾,我们也可以在行的结尾处停止。然后,如果有换行符,将\ n添加到该行的末尾,并且我又增加了一次以避免避免用\ 0覆盖它。

回答

##代码##

回答

该功能从标准输入读取字符,直到找到EOF或者换行符为止。

第二个检查确保将唯一的换行符放入char数组中。 EOF不应出现在适当的C字符串中。另外,如果字符不是换行符,则意味着我们可能已经填满了c字符串,在这种情况下,我们不应在其中添加更多字符。

注意,我们仍然添加" \ 0"。我们确保在c字符串中还有一个字符空间,因为我们使用了前缀递减器,该变量在比较之前进行评估。

回答

我不确定我是否理解这个问题。 c!='\ n'用于在出现行尾(换行)时停止读取行。否则,即使它在极限之前结束,我们也将一直读取直到极限。如果已达到换行,则while循环中的第一个s [i ++] = c;不会发生。这就是为什么以后要进行特殊测试的原因,而其他s [i ++] = c;则是如果换行符破坏了循环。

回答

没有回答问题,但是我还是会写一些评论:

我不记得所有的K&R规则,但是如果lim等于1,那么我们列出的功能将失败。然后,我们将不会运行使c保持未初始化状态的循环,但是我们仍将在if(c =='\ n')检查中使用该变量。

而且while(--lm> 0; ...)不会通过编译器。除掉 ';'确实如此。

回答

代码中有一个错误。

如果s的大小为N个字节,并且用户键入换行符作为第(N-1)个字符,则第N个字符将变为'\ n',第(N + 1)个字符(未分配)将变为成为'\ 0'。