6

次のコードの getline() 関数とパラメーターの定義に関して質問があります。このコードは、K&R の 1.9 章「文字配列」から直接引用しています。こちらにそのまま転載させていただきました。問題は、プログラムをそのままコンパイルすると、3 つのエラーが発生することです (最後に再現しました)。エラーが発生した 3 つの場所で関数と関数パラメーターの定義を get_line() に変更すると (getline ではなくアンダースコアを使用)、エラーは停止し、プログラムは期待どおりに実行されます。

私の質問は:

getline() は無効ですが、get_line() は関数定義の有効な名前になるように、C で何が変更されましたか?

#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)

4

3 に答える 3

3

stdio.hの宣言が既にありますgetline()

関数の定義に同じ名前を使用しないでくださいgetline

同じ関数を宣言および定義する場合は、別の名前を使用する必要があります。お気に入りget_line()

于 2013-10-12T20:01:28.950 に答える
2

新しく宣言された getline 関数と stdio.h で宣言された関数の間で競合が発生します。

于 2013-10-12T20:01:55.743 に答える