You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《C程序设计语言》1.9节字符数组示例代码编译报错求助

解决K&R《C程序设计语言》1.9节示例代码编译冲突问题

问题原因

你遇到的编译错误是因为macOS系统的标准库(stdio.h)中已经内置了一个getline函数,它的签名是:

ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream)

而你从书中实现的getline签名是int getline(char s[], int lim),两者参数数量、类型完全不匹配,因此编译时触发了类型冲突和参数错误。

K&R的这本书出版时,POSIX标准还未将getline纳入标准库,所以书中使用了这个函数名;如今主流系统都支持POSIX扩展,才导致了命名冲突。

解决方案:重命名自定义函数

最直接且无副作用的解决方法是把你实现的getline函数改名,比如改成my_getline,需要修改三处:

  1. 函数声明
  2. main函数中的调用
  3. 函数定义

修改后的完整代码如下:

#include <stdio.h>
#define MAXLINE 1000

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

int main() {
    int len; 
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;

    while ((len = my_getline(line, MAXLINE)) > 0) {
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    }
    if (max > 0)
        printf("%s", longest);
    return 0;
}

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

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

可选方案:指定C标准编译

如果你不想修改函数名,可以在编译时指定使用C99标准(该标准中没有getline函数),编译命令如下:

gcc -std=c99 scratch.c -o scratch

不过这种方法依赖编译选项,跨平台兼容性不如重命名稳定。

内容的提问来源于stack exchange,提问作者branperr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:53:18