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

请求协助编写C语言文件解析与分类整理输出程序

解析无分隔符航空信息的C语言实现

我先帮你梳理下从输入字符串里拆分各字段的核心规则,从你给的样例来看,每个航空公司的信息块是用空格分隔的,而每个块内部的字段是靠字段格式特征来区分的:

  • 公司名称:由字母(可能带空格)组成,结束于第一个连续8位数字的起始位置
  • 成立日期:固定8位数字(格式看起来是MMDDYYYY)
  • 航班号:以2个大写字母开头,后跟若干数字,结束于第一个小写字母(出发城市的起始)
  • 出发/抵达城市:全小写字母组成,两个城市连续排列,结束于数字(剩余燃油量的起始)
  • 剩余燃油量:连续数字,结束于大写字母(机型的起始)
  • 机型:大写字母+数字的组合,是每个信息块的最后部分

基于这些规则,下面是完整的C语言代码实现:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 解析单个航空公司的信息块
void parse_airline_info(const char *info) {
    char company_name[100], founded[9], flight_num[20], dep_city[50], arr_city[50], fuel[10], model[20];
    const char *ptr = info;

    // 1. 提取公司名称:直到遇到第一个数字(成立日期的起始)
    int i = 0;
    while (*ptr && !isdigit((unsigned char)*ptr)) {
        company_name[i++] = *ptr++;
    }
    company_name[i] = '\0';
    // 去掉末尾可能的空格(如果有的话)
    if (i > 0 && isspace((unsigned char)company_name[i-1])) {
        company_name[i-1] = '\0';
    }

    // 2. 提取成立日期:固定8位数字
    strncpy(founded, ptr, 8);
    founded[8] = '\0';
    ptr += 8;

    // 3. 提取航班号:大写字母开头,后跟数字,直到遇到小写字母
    i = 0;
    while (*ptr && isupper((unsigned char)*ptr)) {
        flight_num[i++] = *ptr++;
    }
    while (*ptr && isdigit((unsigned char)*ptr)) {
        flight_num[i++] = *ptr++;
    }
    flight_num[i] = '\0';

    // 4. 提取出发城市:小写字母,直到下一段小写字母(抵达城市)
    i = 0;
    while (*ptr && islower((unsigned char)*ptr)) {
        dep_city[i++] = *ptr++;
    }
    dep_city[i] = '\0';

    // 5. 提取抵达城市:继续提取小写字母,直到遇到数字
    i = 0;
    while (*ptr && islower((unsigned char)*ptr)) {
        arr_city[i++] = *ptr++;
    }
    arr_city[i] = '\0';

    // 6. 提取剩余燃油量:数字,直到遇到大写字母
    i = 0;
    while (*ptr && isdigit((unsigned char)*ptr)) {
        fuel[i++] = *ptr++;
    }
    fuel[i] = '\0';

    // 7. 提取机型:剩余的所有字符(大写+数字)
    strcpy(model, ptr);

    // 格式化输出
    printf("公司名称:%s 成立日期:%s 航班号:%s 出发城市:%s 抵达城市:%s 剩余燃油量(升):%s 机型:%s\n",
           company_name, founded, flight_num, dep_city, arr_city, fuel, model);
}

int main() {
    // 补全air canada部分的示例输入
    char input[] = "air qatar06281957AT680londonmadrid380B777 turkish airlines05201933TK1298istanbulmadrid250A380 lufthansa01061953LH29frankfurtmadrid75B747 air canada06011937AC123torontomontreal420B787";
    
    // 用空格分割每个航空公司的信息块
    char *token = strtok(input, " ");
    while (token != NULL) {
        parse_airline_info(token);
        token = strtok(NULL, " ");
    }

    return 0;
}

代码关键说明:

  1. 分割信息块:用strtok函数把输入字符串按空格分割成单个航空公司的信息块,逐个处理。
  2. 字段提取逻辑:每个字段都依靠其格式特征(数字、大小写字母)来确定边界,比如公司名称到第一个数字结束,成立日期固定8位,航班号是大写字母+数字组合等。
  3. 边界处理:比如公司名称末尾可能带空格,代码里做了去除处理;每个字段提取后都手动添加字符串结束符'\0',避免内存越界。

测试输出:

运行代码后,会输出:

公司名称:air qatar 成立日期:06281957 航班号:AT680 出发城市:london 抵达城市:madrid 剩余燃油量(升):380 机型:B777
公司名称:turkish airlines 成立日期:05201933 航班号:TK1298 出发城市:istanbul 抵达城市:madrid 剩余燃油量(升):250 机型:A380
公司名称:lufthansa 成立日期:01061953 航班号:LH29 出发城市:frankfurt 抵达城市:madrid 剩余燃油量(升):75 机型:B747
公司名称:air canada 成立日期:06011937 航班号:AC123 出发城市:toronto 抵达城市:montreal 剩余燃油量(升):420 机型:B787

如果你的输入里air canada后面的内容有不同格式,只需要确保字段的格式特征和代码里的逻辑匹配即可,要是有特殊情况(比如公司名称里带数字),可以再调整对应的判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:34:41