【问题标题】:How does getline() function work here?getline() 函数在这里如何工作?
【发布时间】:2013-08-16 16:40:27
【问题描述】:

我不明白getline 函数在这里是如何工作的。为什么换行符被排除在 for 循环之外,为什么要在单独的块中测试换行符的存在?

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print the longest input line */
main()
{
    int len; /* current line length */
    int max; /* maximum length seen so far */
    char line[MAXLINE]; /* current input line */
    char longest[MAXLINE]; /* longest line saved here */
    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0) /* there was a line */
        printf("%s", longest);
    return 0;
}


/* getline: read a line into s, return length */
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;
}


/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

【问题讨论】:

    标签: c function getline


    【解决方案1】:

    getline 将从stdin 中读取一行。由于行由换行符('\n' 字符)分隔,getline 将读取到并包括换行符。 getline 越过换行符是没有意义的,因为它会读取不止一行。

    有三种情况会导致 for 循环停止。

    1)遇到\'n'
    如果发生这种情况,它将在添加空终止符之前将换行符添加到当前字符串的末尾。这就是if (c == '\n') 的用途。

    2) 读取 EOF 3) 读取的最大字符数。
    如果出现上述任何一种情况,则跳过在字符串末尾添加换行符,只添加空终止符。

    空终止符('\0' 字符)是 C 表示字符串结尾的方式。

    【讨论】:

    • 明白了。我想这很简单。
    【解决方案2】:

    他们在循环中排除 \n 然后随后检查 \n 的原因是因为在 for 循环完成后 c 的值仍然被分配(仍在范围内)。看起来有点复杂的一个原因是他们决定排除括号。由于该功能是获取下一行,因此当您获取换行符“\n”时,一行将“结束”。写这个使它更具可读性,它看起来像:

    int getline(char s[],int lim)
    {
        int c,
        int 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;
    }
    

    【讨论】:

      【解决方案3】:

      读到行尾时需要考虑三种重要情况。那些是:

      1. 我们已达到缓冲区中允许的最大字节数。
      2. 我们已到达EOF,因此没有其他内容可供阅读。
      3. 我们已到达行尾字符,应停止继续阅读。

      for 循环中,如下:

      • i &lt; ( lim - 1 ) 检查案例 1。
      • ( c = getchar() ) != EOF 检查案例 2(丑陋)。
      • c != '\n' 检查案例 3。

      ...在读取换行符时需要短路的原因是因为这是函数的内涵。它还读取换行符并将其包含在字符串中。最后一步:

      s[ i ] = '\0';
      

      ... 确保它是一个以NULL 结尾的字符串(C 中的约定)。然后它返回读取的字节数(这并不罕见)。

      【讨论】:

        【解决方案4】:

        我也想出了这个问题。这是您问题的可能答案。

        1) 这个问题的第一个误解是 getline 本身。 特别是在这段代码中 getline 是一个用户定义的函数。 某些编译器可能会弹出错误。所以试试这个函数的另一个名字(也许 getl 或者你觉得适合自己的名字)

        2)其次,main() 充当接受输入字符串的中间体。 它检查输入字符串的长度(由函数 getline() 计算)是否大于零和最大值。

        3) 复制函数将字符数组中最长的字符串的值复制到最长。

        当打印代码说: printf("%s",longest); 现在出现了一个问题。为什么不使用 for 循环来打印字符串。 嗯,这也是正确的,但它需要更多的步骤和迭代,这是低效的。

        这是我想出来的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-04
          • 2015-06-08
          • 2018-03-18
          • 2017-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多