【问题标题】:Why do we use extra expression?为什么我们要使用额外的表达式?
【发布时间】:2010-09-09 11:19:24
【问题描述】:

这是 Kernighan & Ritchie 的“C 编程语言”中的一个示例:

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?

【问题讨论】:

    标签: c


    【解决方案1】:

    您这样做只是为了在新行上退出 while 循环。否则,您必须在 body 中检查它并使用 break。

    【讨论】:

    • 哦,因为 c 可以赶上下一行...真的很简单,谢谢。
    【解决方案2】:

    比较是为了确保 readline 在遇到换行符('\n')时终止。在它执行的迭代中,它终止而不向字符串添加换行符,因此之后的语句确保字符串始终以换行符终止,即使达到其他终止条件之一。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        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;
        }
        

        【讨论】:

          【解决方案5】:

          函数从标准输入读取字符,直到找到 EOF 或换行符。

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

          请注意,我们仍然会附加“\0”。我们已经确保在 c 字符串中还有一个字符的空间,因为我们使用前缀递减器,它在比较之前进行评估。

          【讨论】:

          • 你不是说前缀减量器吗?我假设你在谈论 --lim 因为这是代码中唯一的减量器。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            不回答你的问题,但我还是会写一些cmets:

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

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

            【讨论】:

              【解决方案8】:

              代码中存在错误。

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-04-17
                • 2012-10-01
                • 1970-01-01
                • 2015-05-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多