菜鸟驿站收到快递后,会给大宁发送一封含有取件码的信息。 如 : You have 2 parcels to Cainiao Station. Please with 10-1-3125, 1-5-4453 pick them up before 17:00. 一个合法的取件码的格式为 A-B-C。 其中 A为一位或两位数字,B为一位数字,C为四位数字,且不能有多余的数字或符号(包括换行符)。 10-1-3125、1-5-4453 是合法的取件码。 101-1-3125、10-12-315、10-1-23333 都不是合法的取件码。 现在大宁有一段短信,他太懒了以至于不想看它,请你为他提取出所有合法的取件码并 按出现顺序 输出。 如果一个合法的取件码也没有请输出 −1 。 输入数据一段仅由可显示 ASCII 字符组成的信息。 输出数据提取出的取件码,每个一行。注意取件码可能有多个 保证存在 30%的数据,信息的长度小于 50并且没有换行; 保证存在 20%的数据,其中的信息只有数字和 -; 对于 100%的数据,保证信息的长度小于 10000。 对于单个取件码,可能包含在别的字符串中,只要能从中提取出上述A-B-C即可 使用C语言解决,只使用C语言标准库
时间: 2024-04-11 22:33:19 浏览: 136
首先,我们需要读取输入的短信信息。可以使用C语言的标准库函数`fgets`来读取一行文本。
然后,我们可以使用正则表达式来匹配合法的取件码。C语言中没有内置的正则表达式库,但我们可以使用第三方库`PCRE`(Perl Compatible Regular Expressions)来处理正则表达式。需要先安装`PCRE`库,并将其头文件包含在代码中。
以下是一个示例代码,用于提取短信中的合法取件码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pcre.h>
#define MAX_LINE_LENGTH 10000
void extract_pickup_codes(const char *message) {
pcre *regex;
const char *error;
int erroffset;
int ovector[30];
int rc;
// 编译正则表达式
regex = pcre_compile("\\b(\\d{1,2}-\\d-\\d{4})\\b", 0, &error, &erroffset, NULL);
if (regex == NULL) {
printf("Failed to compile regex: %s\n", error);
return;
}
// 匹配正则表达式
const char *ptr = message;
while ((rc = pcre_exec(regex, NULL, ptr, strlen(ptr), 0, 0, ovector, 30)) >= 0) {
// 提取匹配到的取件码
for (int i = 0; i < rc; i++) {
int start = ovector[2 * i];
int end = ovector[2 * i + 1];
int length = end - start;
char *pickup_code = malloc(length + 1);
strncpy(pickup_code, ptr + start, length);
pickup_code[length] = '\0';
printf("%s\n", pickup_code);
free(pickup_code);
}
ptr += ovector[1];
}
pcre_free(regex);
}
int main() {
char message[MAX_LINE_LENGTH];
// 读取短信信息
fgets(message, sizeof(message), stdin);
// 提取合法的取件码
extract_pickup_codes(message);
return 0;
}
```
你可以将短信信息输入到程序中,并且程序将会输出所有提取到的合法取件码,每个一行。如果没有合法的取件码,则输出 `-1`。
请注意,上述代码使用了第三方库`PCRE`,你需要在编译时链接该库。编译命令示例:`gcc -o extract_pickup_codes extract_pickup_codes.c -lpcre`。
阅读全文