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 < lim-1 && (c=getchar())!=EOF && c!='\n'
的意思是:“分配给c
一个用`getchar() 得到的字符直到...”:
\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 语言)中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章