K& R第2版,例1.9字符阵列

时间:2013-10-12 19:58:32

标签: c arrays kernighan-and-ritchie

我在以下代码中有关于getline()函数和参数定义的问题。代码直接取自K& R第1.9章:“字符数组”。我在这里逐字复制。问题是,当我编译程序时,我得到三个错误,(我在最后复制)。当我在我得到错误的三个地方将函数和函数参数定义更改为get_line()(使用下划线而不是getline)时,错误停止并且程序按预期运行。

我的问题是:

C中发生了什么变化,因此getline()无效,但get_line()是函数定义的有效名称?

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

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

/* print longest input line */

int main()
{
    int len;            //current line lenght
    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;
    }
}

我得到的错误是:

  • ./ section 1.9.1.c:4:5:错误:'getline'的冲突类型; int getline(int line[], int maxline);

  • ./ section 1.9.1.c:17:40:错误:函数调用的参数太少,预期3,有2个 while ((len = getline(line, MAXLINE)) > 0);

  • ./ section 1.9.1.c:30:5:错误:'getline'的冲突类型 int getline(int s[], int lim)

3 个答案:

答案 0 :(得分:4)

glibc一起分发的stdio库声明了一个名为getline的函数,该函数的签名与您的签名不同。由于您无法声明具有相同名称的两个函数,因此编译器会给出错误。在stdio.h中找到的getline的冲突声明是:

   ssize_t getline(char **lineptr, size_t *n, FILE *stream);

getline函数最初是glibc扩展,然后被包含在POSIX.1-2008中。 它不是标准的C函数。

如果您使用gcc,则可以使用-std命令行开关获得符合标准的行为。除此之外,这隐藏了非标准功能的声明。试试例如:

gcc -Wall -pedantic -std=c11 "section 1.9.1.c" -o "section 1.9.1"

答案 1 :(得分:3)

stdio.h已声明getline()

您不应使用相同的名称来定义getline功能。

如果要声明和定义相同的功能,则应使用其他名称。比如get_line()

答案 2 :(得分:2)

新声明的getline函数与stdio.h中声明的getline函数之间会发生冲突。