短消息筛选电话 C语言 编译原理作业




//【问题描述】从短文本中识别所有电话号码
//【输入形式】文本文件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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值