7

重複の可能性:
K&RによるCの学習、配列と関数呼び出しを使用して本からプログラムをコンパイルしようとするとエラーが発生する

BrianW.KernighanとDennisM.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; 
}

2つの主なエラーがあります。

  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

問題は、inの定義が存在する可能性が高いことgetlineですstdio.h。私のバージョンのLinuxには、Cライブラリ(私が思うPOSIX標準の一部)によって提供されるgetline関数があります。Cで同じ名前の2つの関数を持つことはできません。これが、あなたの問題です。バージョンの名前をgetlinetoに変更してみてくださいmy_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 に答える