【问题标题】:What's the role of c != '\n' condition in "for" loop (C language)?c != '\n' 条件在“for”循环(C 语言)中的作用是什么?
【发布时间】:2020-10-01 01:51:49
【问题描述】:

这个函数的输入是s[] - 字符数组和lim - 这个数组的最大可能长度。

函数本身用于确定输入到控制台中的输入字符数组的长度。

问题是,c != '\n' 循环中的c != '\n' 条件的主要思想是什么?

我猜它是用来打破循环的。这很清楚。但是如果我不在输入中输入\n,我将无法理解它是如何实现的。

这是像\0 这样的数组末尾的终结符吗?

如果是这样,我们为什么要在那之后使用if (c == '\n') 条件?

代码:

int getline(char s[],int lim)
{
    int c, i;
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

【问题讨论】:

  • 不是c! = '\n'而是c != '\n'

标签: c arrays for-loop conditional-statements character


【解决方案1】:

嗯,你想得到一条线。 \0 终止字符串,但一个字符串可以存在多行。正如函数的名称所示,您只需要一行。行以\n 结束,然后新行开始。

【讨论】:

  • 因此,如果我以正确的方式得到它,\n 将在任何行的末尾终止。那如果任何一行默认包含\n,为什么还要在后面引入if语句呢?
  • 我认为函数的作者想保留\n。读取最后一行时,行尾没有\n。所以基本上\n 仅附加到s[] 如果它不是缓冲区中的最后一行(并且未达到行字符限制)。
  • 谢谢,现在很清楚了。只是为了澄清这个功能。然后该程序的下一步是将构造的字符串复制到另一个 char 数组中(用于与其他输入的字符串进行对比,如果它是最长的则打印出来)。
【解决方案2】:

因为'\n'只是条件之一—— 也可以是作者不想保存的 EOF,也可以达到字符数限制,我们不想将 nul 终止符写出 char 数组边界

nul 终止与这些条件中的任何一个都无关,它总是会发生

【讨论】:

    【解决方案3】:

    如果读取的字符c 是返回新行\n,则for 循环将停止,数组将以\n 结尾,后跟\0

    这就是函数应该做的事情,它被称为getline(),行以\n结尾。

    【讨论】:

      【解决方案4】:

      条件

      c != '\n'
      
      如果遇到不同于换行符字符的字符,

      被评估为true

      如您所见,既然是getline() 实现,那么停止从输入字符串读取是一个很好的理由。

      请注意,在此检查结束后,如何执行循环 s[i] = '\0'; 以便在之前换行符所在位置之后的一个位置终止字符串。


      那么,getline() 是如何工作的?

      该函数的核心是for循环

      for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
      

      条件i &lt; lim-1 &amp;&amp; (c=getchar())!=EOF &amp;&amp; c!='\n' 的意思是:“分配给c 一个用`getchar() 得到的字符直到...”

      • 读取的字符是EOF
      • 读取的字符是\n(换行符)
      • 已读取调用者 (lim) 请求的字符数

      【讨论】:

      • @RobertSsupportsMonicaCellio 啊啊!对许多“否定”(结束太匆忙写答案:))。谢谢指正。
      • @RobertoCaboni 也经常发生在我身上。 :-)
      【解决方案5】:

      当您按下 Enter 时,一个 \n 换行符将添加到输入缓冲区,stdin,这意味着这是输入缓冲区中的最后一个字符。

      所以它只适合循环继续直到getchar() 检索到最后一个字符。

      循环控制声明c必须是:

      • 不同于\n
      • 不同于EOF
      • 并且迭代器i必须小于lim - 1

      如果不满足这些条件之一,则循环中断,那么c 可能不等于\n

      之后,如果c等于\n,它将被添加到s,条件if (c == '\n')在那里,因为如上所述,c可能不等于\n,在这种情况下,不应将其添加到 s

      最后,s 必须以 null 结尾 (s[i] = '\0') 以便可以正确解释为字符串,也就是以 null 结尾的 char 数组。 \n 不是空终止符,\0 是。

      添加\n 的事实只是因为实现者希望它如此,它是实现的一部分,它不必是,但它确实是。 它在某些情况下很有用,例如 fgets 库函数有一个类似的实现,它将 \n 添加到包含缓冲区,然后 null 终止它。

      【讨论】:

      • 非常感谢内部机制的解释。这就是我一直在寻找的。​​span>
      • @SoHereWeGo,很高兴我能帮上忙。
      【解决方案6】:

      逻辑很简单:

      for 循环中,我们说当用户点击Enter 时,停止阅读;所以它停止并且不会读取输入的其余部分。因为条件c!='\n' 变为假。

      在 if 语句中,我们告诉程序继续阅读;所以“如果”用户点击Enter,程序将从中断的地方开始读取其余的输入,并再次开始循环。

      if 语句是为了防止循环停止,也是告诉程序输入中有单独的行的一种方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-29
        • 2019-01-02
        • 2010-09-21
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        相关资源
        最近更新 更多