7

可能重复:
通过 K&R 学习 C,尝试使用数组和函数调用从书中编译程序时出错

在学习 Brian W. Kernighan 和 Dennis M. Ritchie 的 C 编程语言时,我尝试了 1.9 节字符数组中的示例。以下是代码:

/* read a set of text lines and print the longest */

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

/* declare functions: getline() and copy() */
int getline(char line[], int maxline); 
void copy(char to[], char from[]);

/* getline: read a line into array "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';  /* the null character whose value is 0 */
    return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */ 
/* the return type of copy is "void" -- no value is returned */
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')  /* terminated with a \0 */
        ++i; 
}

/* print the longest input line */
int 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; 
}

有两个主要错误:

  1. 错误:“getline”的类型冲突</li>
  2. 错误:“getline”的先前声明在这里

完整的错误列表在这里:

/Users/C/Codes/Ritchie/array_char.c:8: error: conflicting types for ‘getline’
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
/Users/C/Codes/Ritchie/array_char.c:13: error: conflicting types for ‘getline’
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
/Users/C/Codes/Ritchie/array_char.c: In function ‘getline’:
/Users//C/Codes/Ritchie/array_char.c:17: warning: comparison between pointer and integer
/Users/C/Codes/Ritchie/array_char.c:17: warning: comparison with string literal results in unspecified behavior

我不确定出了什么问题,因为它与书中的代码完全相同。也许在开头的函数声明:

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

有问题吗?谢谢!

4

4 回答 4

8

http://www.kernel.org/doc/man-pages/online/pages/man3/getline.3.html

getline 已存在于 stdio.h 中。这就是您收到错误的原因。将函数名称更改为 getline_my 之类的其他名称。

此外,您正在将第 16 行中的字符与字符串进行比较。它应该是
if(c == '\n')

不是

if(c == "\n")

于 2012-11-04T02:34:23.467 回答
4

问题是getlinein可能有一个定义stdio.h。在我的 linux 版本中,有一个由 C 库提供的 getline 函数(我认为是 POSIX 标准的一部分)。你不能在 C 中拥有两个同名的函数,这是你的问题。尝试将您的版本重命名getlinemy_getline(您声明/定义它的位置以及使用它的位置)。

于 2012-11-04T02:33:16.363 回答
2
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here

就像它所说的那样:getline在中声明stdio.h(因为标准库提供了一个具有该名称的函数)。您不能使用该名称提供您自己的函数,因为当您调用 时getline,编译器不知道要使用哪一个。

于 2012-11-04T02:37:08.703 回答
1

从那本书写成之日到现在,标准 C 库进行了一些修改,并且它们不再是旧的和新的一致的。

您必须删除声明,并保留当前 stdio.h 中的声明。

于 2012-11-04T02:36:17.517 回答