//【问题描述】从短文本中识别所有电话号码
//【输入形式】文本文件input.txt存放短文本
//【输出形式】文本文件output.txt存放识别结果
//【样例输入】石家庄市新华区中华北大街128号通泰商务B808室 0311-67301817 , 0311-80781234。
//
//【样例输出】
//
//0311-67301817
//
//0311-80781234
//
//【样例说明】这是一个含地址电话的短信文本,其中有两个电话号码
#include <stdio.h>
#include <string.h>
int check_num(char* str, char** tel,int base) {
char* p;
int have; // 电话个数
p = str;
have = 0;
// int tel_end=0; // 电话号码是否符合长度
int is_num = 0; // 是否是数字
int check_num = 0; // 当前电话的第几位
int is_tel = 0; // 是否在电话状态
int tel_lenth = 12; // 合规的电话数字位数
char check[100]; // 当前电话号,用于超长度后取消电话记录
for (int i = 0; i < 100; i++) {
check[i] = '0';
}
while (*p != '\0') {
is_num = 0;
if (*p >= '0' && *p <= '9') {
// printf("%c\n", *p);
// printf("%d\n", check_num);
// ANSI 格式汉字可读
if (is_tel == 0) { // 发现第一个数字,进入电话状态
is_tel = 1;
// printf("find tel\n");
} else {
// num=11 此时发现符合数字,所以预期是12后,如果出现第13位说明有问题,退出电话状态,检测下一位改检测本位,但顺序优先级空格在后
// 发现 - 也进入,所以是超过12+1
if (check_num > tel_lenth + 1) {
// printf("find errer %c\n", *p);
// printf("%c\n", *(p + 1));
// printf("%d\n", *(p + 1));
is_tel = 0;
// printf("tel change\n");
// printf("%d\n", check_num);
check_num = 0;
check[13] = '\0';
// printf("%s\n", check);
}
}
// printf("%c",*p);
is_num = 1;
} else if (*p == ' ') {
// printf("find \" \"!");
// printf("have %d\n",check_num);
is_num = 0;
// 保存电话
if (is_tel == 1 && check_num == tel_lenth + 1) {
// printf("check for function:%s\n", check);
for (int i = 0; i < 13; i++) {
tel[have][i] = check[i];
}
tel[have][13] = '\0';
// 恢复状态
check_num = 0;
is_tel = 0;
have++;
}
} else if (*p == '-') {
if (check_num == 4) {
is_num = 1;
is_tel = 1;
} else {
is_num = 0;
is_tel = 0;
}
} else {
if (is_tel == 1 && check_num == tel_lenth + 1) {
// printf("check for function:%s\n", check);
for (int i = 0; i < 13; i++) {
tel[have][i] = check[i];
}
tel[have][13] = '\0';
// 恢复状态
check_num = 0;
is_tel = 0;
have++;
}
is_num = 0;
is_tel = 0;
}
// 电话号码写入暂存区
if (is_tel == 1 && is_num == 1) {
check[check_num] = *p;
check_num++;
// printf("%d\n", check_num);
} else if (is_num == 0) {
// 中途崩坏则清空缓存数据
// printf("%s\n",check);
check_num = 0;
}
// printf("%c",*p);
p++;
}
// 最后是 *p='\0'
// printf("%d\n", check_num);
// printf("%s\n", check);
if (is_tel == 1 && check_num == tel_lenth + 1) {
// printf("check for function:%s\n", check);
for (int i = 0; i < 13; i++) {
tel[have+base][i] = check[i];
}
tel[have+base][13] = '\0';
// 恢复状态
check_num = 0;
is_tel = 0;
have++;
}
return have;
}
int main() {
FILE *fp;
fp = fopen("input.txt", "r");
//ANSI格式 UTF-8格式乱码
// fp = fopen("inputv2.txt", "r");
// printf("mytest 中文\n");
char* str;
char** tel;
str = new char[10000];
tel = new char*[10];
for (int i = 0; i < 10; i++) {
tel[i] = new char[30];
}
int sum;
sum=0;
while (fgets(str, 10000, fp) != NULL) {
sum += check_num(str, tel,sum);
// printf("%d\n", sum);
// printf("当前读取字符:%s\n", str);
if (strlen(str) == 0) {
printf("文件是空的\n");
}
}
FILE* fp_out;
fp_out = fopen("output.txt", "w");
for (int i = 0; i < sum; i++) {
fprintf(fp_out, "%s", tel[i]);
fprintf(fp_out, "\n");
}
for (int i = 0; i < sum; i++) {
printf("%s\n", tel[i]);
}
fclose(fp);
fclose(fp_out);
return 0;
}