"for"循环中c != '\n'条件的作用是什么(C语言)?
What's the role of c != '\n' condition in "for" loop (C language)?
此函数的输入是 s[]
- 字符数组和 lim
- 此数组的最大可能长度。
该函数本身用于确定在控制台中输入的输入字符数组的长度。
问题是,for
循环中 c != '\n'
条件的主要思想是什么?
我猜它是用来打破循环的。这很清楚。但是如果我不在输入中输入 \n
,我就无法理解它是如何实现的。
那是像[=17=]
这样的数组末尾的终止符吗?
如果是这样,我们为什么要在那之后使用 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] = '[=11=]';
return i;
}
嗯,你想要一条线。 [=10=]
终止字符串,但一个字符串可以存在多行。由于函数名称表明您只需要一行。行以 \n
结束,然后新行开始。
因为'\n'
只是条件之一——
它也可以是作者不想保存的 EOF,也可以达到字符数限制,我们不想将 nul 终止符写出字符数组边界
nul 终止与任何这些条件都无关,它总是会发生
如果读取的字符c
是一个return到新行\n
,那么for
循环将停止,数组将以[=11结束=] 后跟 [=14=]
.
这就是函数应该做的,它被称为 getline()
,并且行以 \n
.
结尾
条件
c != '\n'
如果遇到不同于 换行 字符的字符, 将被评估为 true
。
正如您所理解的,由于它是一个 getline()
实现,因此停止读取输入字符串是一个很好的理由。
请注意,在此检查结束后,如何执行循环 s[i] = '[=14=]';
以终止字符串之前换行符所在位置的位置。
那么,getline()
是如何运作的?
该函数的核心是for循环
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
条件i < lim-1 && (c=getchar())!=EOF && c!='\n'
表示:"Assign to c
a character got with `getchar() until...":
- 读取的字符为EOF
- 读取的字符是
\n
(换行符)
- 调用者(
lim
)请求的字符数已读
当您按下 Enter 时,一个 \n
换行符被添加到输入缓冲区,stdin
,这意味着这是输入缓冲区中的最后一个字符输入缓冲区。
所以它只适合循环继续直到 getchar()
检索到最后一个字符。
循环控制指出c
必须是:
- 不同于
\n
。
- 不同于
EOF
。
- 并且迭代器
i
必须低于lim - 1
。
如果不满足这些条件之一,则循环中断,因此 c
可能不等于 \n
。
之后,如果c
等于\n
,它会被添加到s
,条件if (c == '\n')
就在那里,因为,如前所述,c
可能不等于 \n
,在这种情况下,不应将其添加到 s
.
最后 s
必须以空值终止 (s[i] = '[=28=]'
),以便它可以正确地解释为字符串,也就是空值终止的 char 数组。 \n
不是空终止符,[=30=]
是。
添加 \n
只是因为实施者希望如此,它是实施的一部分,不一定非要如此,但确实如此。
它在某些情况下很有用,例如 fgets
库函数有类似的实现,它将 \n
添加到包含缓冲区,然后 null 终止它。
逻辑很简单:
在 for
循环中,我们说当用户点击 Enter
时,停止阅读;所以它停止并且不会读取其余的输入。因为条件 c!='\n'
变为假。
在 if 语句中,我们告诉程序继续阅读;所以“如果”用户点击 Enter
,程序将从它停止的地方开始读取剩余的输入,并再次开始循环。
if 语句是为了防止循环停止,也是一种告诉程序输入中有单独行的方式。
此函数的输入是 s[]
- 字符数组和 lim
- 此数组的最大可能长度。
该函数本身用于确定在控制台中输入的输入字符数组的长度。
问题是,for
循环中 c != '\n'
条件的主要思想是什么?
我猜它是用来打破循环的。这很清楚。但是如果我不在输入中输入 \n
,我就无法理解它是如何实现的。
那是像[=17=]
这样的数组末尾的终止符吗?
如果是这样,我们为什么要在那之后使用 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] = '[=11=]';
return i;
}
嗯,你想要一条线。 [=10=]
终止字符串,但一个字符串可以存在多行。由于函数名称表明您只需要一行。行以 \n
结束,然后新行开始。
因为'\n'
只是条件之一——
它也可以是作者不想保存的 EOF,也可以达到字符数限制,我们不想将 nul 终止符写出字符数组边界
nul 终止与任何这些条件都无关,它总是会发生
如果读取的字符c
是一个return到新行\n
,那么for
循环将停止,数组将以[=11结束=] 后跟 [=14=]
.
这就是函数应该做的,它被称为 getline()
,并且行以 \n
.
条件
c != '\n'
如果遇到不同于 换行 字符的字符, 将被评估为 true
。
正如您所理解的,由于它是一个 getline()
实现,因此停止读取输入字符串是一个很好的理由。
请注意,在此检查结束后,如何执行循环 s[i] = '[=14=]';
以终止字符串之前换行符所在位置的位置。
那么,getline()
是如何运作的?
该函数的核心是for循环
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
条件i < lim-1 && (c=getchar())!=EOF && c!='\n'
表示:"Assign to c
a character got with `getchar() until...":
- 读取的字符为EOF
- 读取的字符是
\n
(换行符) - 调用者(
lim
)请求的字符数已读
当您按下 Enter 时,一个 \n
换行符被添加到输入缓冲区,stdin
,这意味着这是输入缓冲区中的最后一个字符输入缓冲区。
所以它只适合循环继续直到 getchar()
检索到最后一个字符。
循环控制指出c
必须是:
- 不同于
\n
。 - 不同于
EOF
。 - 并且迭代器
i
必须低于lim - 1
。
如果不满足这些条件之一,则循环中断,因此 c
可能不等于 \n
。
之后,如果c
等于\n
,它会被添加到s
,条件if (c == '\n')
就在那里,因为,如前所述,c
可能不等于 \n
,在这种情况下,不应将其添加到 s
.
最后 s
必须以空值终止 (s[i] = '[=28=]'
),以便它可以正确地解释为字符串,也就是空值终止的 char 数组。 \n
不是空终止符,[=30=]
是。
添加 \n
只是因为实施者希望如此,它是实施的一部分,不一定非要如此,但确实如此。
它在某些情况下很有用,例如 fgets
库函数有类似的实现,它将 \n
添加到包含缓冲区,然后 null 终止它。
逻辑很简单:
在 for
循环中,我们说当用户点击 Enter
时,停止阅读;所以它停止并且不会读取其余的输入。因为条件 c!='\n'
变为假。
在 if 语句中,我们告诉程序继续阅读;所以“如果”用户点击 Enter
,程序将从它停止的地方开始读取剩余的输入,并再次开始循环。
if 语句是为了防止循环停止,也是一种告诉程序输入中有单独行的方式。