"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 语句是为了防止循环停止,也是一种告诉程序输入中有单独行的方式。