【问题标题】:warning: implicit declaration of function 'getline'警告:函数“getline”的隐式声明
【发布时间】:2019-11-24 02:19:52
【问题描述】:

您好,我的课堂项目几乎完成了。我需要根据几个因素对航空公司人员的优先级进行排序。这是我的项目描述:

“一家航空公司使用如下所示的公式来确定乘客在航班上的优先级 超额预订航班的候补名单。 优先级数 = (A / 1000) + B - C 在哪里 A是客户过去一年的总里程 B 是他或她的常旅客计划的年数 C 是一个序列号,表示客户在预订时到达的位置 航班。 给定一个如下表所示的超额预订客户文件,编写一个程序,读取 文件并确定每个客户的优先级编号。然后程序建立一个优先队列 使用优先级编号并按优先级顺序打印等待客户的列表。”

我觉得我的代码包含了主要思想,但我遇到了 getline 问题。当我编译代码(如下所示)时,它给了我一个错误: "|24|警告:函数 'getline' 的隐式声明 [-Wimplicit-function-declaration]|"

请帮我解决这个问题,以便编译。我已经尝试了很多东西,但没有任何效果。

代码如下:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE * fp; //create file pointer to be read later
    char * line = NULL;
    int temp,count=0,len=0,mileage[100],read,years[100],sequence[100],priority[100];
    char name[100][100],tempst[100];
    fp = fopen("customers.txt", "r"); //opening the file

    if (fp == NULL)
        exit(EXIT_FAILURE);
    int i;



    while ((read = getline(&line, &len, fp)) != -1) { //start reading file and recording data
        i=0;

        while(line[i]!=' ' || (line[i+1]>='A' && line[i+1]<='z'))
        {
            name[count][i]=line[i];
            i++;
        }
        name[count][i++]='\0';
        mileage[count]=0;

        while(line[i]!=' ')
        {
            mileage[count]=mileage[count]*10+(line[i]-'0');
            i++;
        }
        i++;
        years[count]=0;

        while(line[i]!=' ')
        {
            years[count]=years[count]*10+(line[i]-'0');
            i++;
        }
        i++;
        sequence[count]=0;

        while(line[i]!='\0')
        {
            sequence[count]=sequence[count]*10+(line[i]-'0');
            i++;
        }
        priority[count]=(mileage[count]/1000)+years[count]-sequence[count];
        count++;

    }

    for( i=0;i<count-1;i++) // calculate priority
    {
        for(int j=i+1;j<count;j++)
        {
            if(priority[i]<priority[j])
            {
                temp=priority[i];
                priority[i]=priority[j];
                priority[j]=temp;
                strcpy(tempst,name[i]);
                strcpy(name[i],name[j]);
                strcpy(name[j],tempst);
            }
        }
    }

    for( i=0;i<count;i++) //print priority
    {
        printf("%s %d\n",name[i],priority[i]);
    }
    return 0;
}

【问题讨论】:

标签: c project


【解决方案1】:
#define  _GNU_SOURCE
#include <stdio.h>

#define  _POSIX_C_SOURCE 200809L
#include <stdio.h>

应该在 GNU 系统上为您提供 getline,但可能还有另一种方法可以在不同的 POSIX 系统上启用它。

像这样启用getline 后,len 变量应输入size_t,而不是int,以便&amp;len 正确输入为size_t *

您的项目测试软件可能不支持getline POSIX 函数,在这种情况下,您可能需要根据标准 C 函数重新考虑您的设计。

【讨论】:

  • 我做了您建议的更改,但仍然得到相同的错误.. 隐式声明。对 getline 的未定义引用。我不明白是什么原因造成的。我在一些在线 C 编译器上进行了尝试,它们编译时没有此错误。我正在使用 MingGW 编译器开发代码块。
  • ``` int main() { FILE * fp; //创建稍后读取的文件指针 char * line = NULL;大小t * len = 0; ssize_t 读取; int temp,count=0,mileage[100],years[100],sequence[100],priority[100];字符名称[100][100],tempst[100]; fp = fopen("customers.txt", "r"); //打开文件 if (fp == NULL) exit(EXIT_FAILURE);诠释我; while ((read = getline(&line, &len, fp)) != -1) { //开始读取文件并记录数据 i=0; ....```
  • @CoderJoe MinGW 不支持 POSIX。您学校的测试环境也可能没有。
  • @CoderJoe - 如果你没有getline(),那么使用fgets() 和一个足够大的固定缓冲区来保存行。 (例如char line[1024]; 可以——不要吝啬缓冲区大小——如果在像 TI MSP432 这样的微控制器上,则酌情减少到 2 倍的最长线路)
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2020-07-28
相关资源
最近更新 更多