簡體   English   中英

為什么我會收到此錯誤:getline 的類型沖突

[英]Why do I get this error: Conflicting types for getline

有人可以看看這個並告訴我出了什么問題。 我有 3 個錯誤:

  1. error: Conflicting types for getline
  2. error: too few arguments to function call, expected 3 have 2
  3. error: conflicting types for getline

我確定我忽略了一些簡單的事情,但我找不到我的錯誤。 謝謝,代碼如下:

#include <stdio.h>

#define MAXLINE 1000

int getline(char line[], int maxline); /* conflicting types for getline */
void copy(char to[], char from[]);

main() {
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];
    
    max = 0;
    
    while ((len = getline(line, MAXLINE)) > 0) /* too few arguments to call, expected 3 have 2 */
        if (len > max) {
            max = len;          
            copy(longest, line);
        }   
    
    if (max > 0)
        //printf("longest line = %d characters\n -->", max);
        printf("%s", longest);

    return 0;
}

int getline(char s[], int lim) { /*conflicting types for getline*/

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

void copy(char to[], char from[]) {

    int i;
    i = 0;
    
    while ((to[i] = from[i]) != '\0') {
        ++i;
    }
}

簡單的答案:不要調用你的函數getline 這個名字被取了。

(我知道,這是 K&R 中的一個例子。所以你應該能夠使用它,對嗎?不幸的是,不。我也煩。)

稍微長一點的答案:現在有一個半標准的getline函數,你的函數與之沖突。 如果您嘗試命名您自己的函數之一printf ,您會遇到相同類型的錯誤。 可能有一種說法,“我不想使用標准的getline函數,我想使用我自己的”,但在這種情況下,它可能不值得。

(就個人而言:我已經用 C 編程了大約 35 年,其中大約 34.9 年我一直在使用自己的getline函數,自從我在 K&R 中讀到它。但在過去的一年或所以我不得不重寫我所有的程序,調用我自己的函數fgetline而不是getline來解決這個問題。)

有相同的 GNU 函數getline ,它不是 C 標准的一部分。 據推測,您正在編譯時沒有指定-std (特定的 C 標准),這使得從<stdio.h>公開此函數的 GNU 聲明。

您可以使用-std=c99-std=c11進行編譯,例如:

gcc -Wall -Wextra -std=c11 gl.c

或將您的函數重命名為類似my_getline()以避免這種沖突。

此外, main()的簽名必須是標准簽名之一。 由於您不使用命令行參數,因此可以使用:

int main(void) { .. }

請參閱: main() 在 C 和 C++ 中應該返回什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM