簡體   English   中英

K&R第2版,例1.9字符陣列

[英]K&R 2nd Edition, Example 1.9 Character Arrays

我在以下代碼中有關於getline()函數和參數定義的問題。 代碼直接取自K&R第1.9章:“字符數組”。 我在這里逐字復制。 問題是,當我編譯程序時,我得到三個錯誤,(我在最后復制)。 當我在我得到錯誤的三個地方將函數和函數參數定義更改為get_line()(使用下划線而不是getline)時,錯誤停止並且程序按預期運行。

我的問題是:

C中發生了什么變化,因此getline()無效,但get_line()是函數定義的有效名稱?

#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 int getline(int s[], int lim)沖突類型

glibc分發的stdio庫聲明了一個函數,該函數也稱為getline ,其簽名與您的不同。 由於您無法聲明具有相同名稱的兩個函數,因此編譯器會給出錯誤。 在stdio.h中找到的相互沖突的getline聲明是:

   ssize_t getline(char **lineptr, size_t *n, FILE *stream);

getline函數最初是glibc擴展,然后被包含在POSIX.1-2008中。 它不是標准的C函數。

如果您使用的是gcc ,則可以使用-std命令行開關獲得符合標准的行為。 除此之外,這隱藏了非標准功能的聲明。 試試例子:

gcc -Wall -pedantic -std=c11 "section 1.9.1.c" -o "section 1.9.1"

stdio.h已經有了getline()的聲明,

您不應使用相同的名稱來定義您的getline函數。

如果要聲明和定義相同的函數,則應使用其他名稱。 get_line()

您的新聲明的getline函數與stdio.h中聲明的getline函數之間會發生沖突。

暫無
暫無

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

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