2012-11-04 32 views
5

Possible Duplicate:
Learning C by K&R, error when trying to compile programs from book with arrays and function callskhai trước của 'chức năng' đã ở đây trong C

Trong khi học C Ngôn ngữ lập trình bởi Brian W. Kernighan và Dennis M. Ritchie, tôi đã thử ví dụ trong phần 1.9 Mảng nhân vật. Dưới đây là các mã:

/* 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; 
} 

Có hai lỗi chính:

  1. lỗi: mâu thuẫn loại cho 'getline'
  2. lỗi: khai trước của 'getline' đã ở đây

Danh sách lỗi đầy đủ có tại đây:

/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 

Tôi không chắc chắn những gì đã xảy ra, vì nó chính xác là mã giống với cuốn sách. Có thể tuyên bố các chức năng ngay từ đầu:

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

là có vấn đề? Cảm ơn bạn!

+1

Vui lòng gửi thông báo lỗi thực tế (không diễn giải) – CrazyCasta

+0

Có lý do nào để làm mọi thứ theo cách khó khăn ở đây không, hoặc bạn có thể sử dụng 'fgets' và' strcpy' thay thế không? –

Trả lời

8

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

đường dây đã tồn tại trong stdio.h. Đó là lý do tại sao bạn nhận được lỗi. Thay đổi tên hàm thành một cái gì đó khác như getline_my.

Ngoài ra, bạn đang so sánh một nhân vật với một chuỗi trong dòng 16. Nó phải là
if(c == '\n')

KHÔNG

if(c == "\n")

+0

Phát hiện tốt! Tôi đoán OP đã gõ mã số. –

+0

Vâng, mã OP đã nhập mã. Anh ấy đang đọc một cuốn sách: P – CrazyCasta

+0

@Neo: cảm ơn vì đã chỉ ra điều này! – alittleboy

4

Vấn đề là có khả năng định nghĩa là getline trong stdio.h. Trên phiên bản Linux của tôi có một hàm getline được cung cấp bởi thư viện C (một phần của tiêu chuẩn POSIX mà tôi nghĩ). Bạn không thể có hai hàm có cùng tên trong C và đây là vấn đề của bạn. Thử đổi tên phiên bản getline thành my_getline (cả nơi bạn khai báo/xác định và nơi bạn sử dụng).

1

Từ ngày khi cuốn sách đã được viết đến ngày nay các Thư viện chuẩn C đã sửa đổi một chút và chúng không nhất quán với thư viện cũ và mới.

Bạn phải xóa các khai báo và để lại các khai báo từ stdio.h hiện tại.

+0

Đây không phải là từ việc thay đổi tiêu chuẩn.Đó là từ gcc không phù hợp với tiêu chuẩn. –

+0

Ông có thể đang đọc ấn bản thứ hai, được cập nhật thành ANSI C, sẽ biên dịch trên bất kỳ trình biên dịch C nào. (Ngoài ra, mã ông đã viết nên chạy trên bất kỳ trình biên dịch C bên cạnh thực tế là tên chức năng đã được sử dụng vì vậy ông cần phải thay đổi nó). – CrazyCasta

+0

có, gcc hiện tại là c89 theo mặc định, trừ khi bạn chèn -c99. c11 cũng xuất hiện. – alinsoar

2
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here 

Đó là chính xác như nó nói: getline được khai báo trong stdio.h (vì các thư viện chuẩn cung cấp một chức năng với tên đó). Bạn không thể cung cấp chức năng của riêng bạn với tên đó, bởi vì khi bạn gọi getline, trình biên dịch sẽ không biết cái nào để sử dụng.

Các vấn đề liên quan