请求协助编写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; }
代码关键说明:
- 分割信息块:用
strtok函数把输入字符串按空格分割成单个航空公司的信息块,逐个处理。 - 字段提取逻辑:每个字段都依靠其格式特征(数字、大小写字母)来确定边界,比如公司名称到第一个数字结束,成立日期固定8位,航班号是大写字母+数字组合等。
- 边界处理:比如公司名称末尾可能带空格,代码里做了去除处理;每个字段提取后都手动添加字符串结束符
'\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
相关产品推荐
相关产品推荐

