C语言 为什么这个while循环不能永远运行下去?

qzlgjiam  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(117)
#define MAXLINE 1000
char pattern[] = "ould";
main()
{
    char line[MAXLINE];
    int found = 0;

    while (getline(line,MAXLINE) > 0)
       if (strindex(line, pattern) >= 0 ) {
          printf("%s", line);
          found ++;
       }
    return found
}

为什么while循环会一直运行下去呢?getline(line,1000)会返回行的长度,然后“append it”(?)到MAXLINE,根据行的长度,得到一个大于1000的数字......为什么会降到零以下呢?
我读到getline在“不成功”时返回-1,那是什么时候?什么时候行不被读取?
这是在Kernighan的第69页,我一直在跳过这本书,现在我正在回溯,看看我错过了什么。
请描述您尝试了什么、您期望发生什么以及实际结果。最少20个字符。

hgqdbh6s

hgqdbh6s1#

K&R第二版第69页所示的getline版本定义为:

/* getline: get line into s, return length */
int getline(char s[], int lim)
{
    int c, i;

    i = 0;
    while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
        s[i++] = c;
    if (c == '\n')
        s[i++] = c;
    s[i] = '\0';
    return i;
}

由此我们可以看出,函数要继续使用stdin流中的字符,必须满足的条件之一是返回的字符不等于常量值EOF

(c=getchar()) != EOF

EOFend-of-file表示不再有数据要从流中读取。有关其他详细信息,请参见What is EOF in the C programming language?
如果getchargetline中第一次调用时返回EOF,则i的增量永远不会超过0,并且函数将返回零。
此版本的getline无法返回-1
你表现出的状况

while (getline(line,MAXLINE) > 0)

将导致此循环在返回值 * 小于 * 或 * 等于 * 零时停止。换句话说,当getline指示未读取任何数据时。

ttygqcqt

ttygqcqt2#

我假设您使用的是书中定义的getlinestrindex

/* getline: get line into s, return length */
int getline(char s[], int lim)
{
    int c, i;

    i = 0;
    while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
        s[i++] = c;
    if (c == '\n')
        s[i++] = c;
    s[i] = '\0';
    return i;
}

/* strindex: return index of t in s, -1 if none */
int strindex(char s[], char t[])
{
    int i, j, k;

    for (i = 0; s[i] != '\0'; i++) {
        for (j=i, k=0; t[k] != '\0' && s[j] == t[k]; j++, k++)
            ;
        if (k > 0 && t[k] == '\0')
            return i;
    }
    return -1;
}

正如你所看到的getline读取,直到它到达文件结束(EOF).如果你是在命令行运行程序,你的程序正在等待这个信号从标准,你可以通过按下Control-d手动发送这个信号.
如果你把一个文件装入程序:

$ cat test.txt | ./your program

它发送的文件结束值,位于文件的末尾。

相关问题