【问题标题】:Conflicting types error in C after using prototype使用原型后 C 中的类型冲突错误
【发布时间】:2018-07-05 11:58:51
【问题描述】:

我尝试使用 Xcode 在 K&R (p30) 中运行示例代码。我遇到了“getline”的类型冲突错误,当我调用getline 时,我被告知我应该将3 参数传递给它,而不是2。我很困惑。

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */

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

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

【问题讨论】:

  • 因为有this
  • 不要阅读 K&R。它很古老,你会从中养成很多坏习惯。

标签: c xcode getline


【解决方案1】:

自从编写 K&R 以来,POSIX 增加了一个函数getline() 它的界面与 K&R 中的不同:

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

唯一合理的解决方法是在从书中复制的代码中重命名函数。

(添加时很麻烦——我在 K&R 代码上使用了 20 多年的变体,但没有必要与之抗争。)

【讨论】:

    【解决方案2】:

    我认为您的参数应该具有相同的名称:

    int getline(char line[], int maxline);
    int getline(char s[],int lim)
    

    另外,如上所述,getline 是一个已经存在于 stdio 库中的函数。 你应该像这样重命名你的函数

    int my_getline
    

    什么的。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2014-03-10
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      相关资源
      最近更新 更多