c != '\n' 条件在“for”循环(C 语言)中的作用是啥?

Posted

技术标签:

【中文标题】c != \'\\n\' 条件在“for”循环(C 语言)中的作用是啥?【英文标题】: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' 【参考方案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 语句是为了防止循环停止,也是告诉程序输入中有单独的行的一种方式。

【讨论】:

以上是关于c != '\n' 条件在“for”循环(C 语言)中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中for循环中条件表达式的小于和小于等于问题

C语言中的for循环

用C语言打印乘法口诀表,行可自己输入

C语言中for的双循环怎么用

c语言for语句中的条件问题

用C语言怎么编写一个从1加到10的程序...新手求解