//求挑毛病
//这个项目的最大的收获就是汉字的编码和fputs()函数的应用
#include <stdio.h>
#include <string.h>
#define yidong_path "d:\\data\\yidong\\"
#define liantong_path "d:\\data\\liantong\\"
#define yidong_file_ext "移动.txt"
#define liantong_file_ext "联通.txt"
//通过运营商识别码,识别 返回1 移动 0 联通
int CheckCarrier(char char1, char char2);
//i 代表移动或联通
char *ConnectPath(int carrier, int addr_order);
//填充结构体
struct phone_num *ProcessStruct(char *phone_num, struct phone_num *num);
//通过传入的结构体指针,读写文件,查找归属地
struct phone_num *SearchPlace(struct phone_num *);
//将字符数字转换为数字
int Char2Int(char c);
//用来拼接字符串
//一个汉字是两个字节,然后二维的话如果写5就会出错
char file_name[31][8] = {"安徽", "北京", "福建", "甘肃", "广东", "广西", "贵州",\
"海南", "河北", "河南", "黑龙江","山东", "湖北", "湖南","吉林", "江苏", "江西", "辽宁",\
"内蒙古", "宁夏", "青海", "山西", "陕西", "上海", "四川", "天津", "西藏",\
"新疆", "云南", "浙江", "重庆"};
struct phone_num
{
//把整个号码都保存在里面
char phone_num[12];
//运营商 就是开头1之后的两个数字
char carrier_id[2];
//之后的四位 真正的归属地识别
char city_id[4];
//运营商 1移动 0 联通
int carrier;
//省
char province[10];
//市
char city[10];
};
int main()
{
char phone_num[12] = {'\0'};
char carrier[10];
//电话号码结构体
struct phone_num num;
//电话号码结构体指针
struct phone_num *p_num = #
printf("输入手机号码: ");
scanf("%s", phone_num);
if(strlen(phone_num) != 11)
{
//printf("%d",strlen(phone_num));
//printf("%s", phone_num);
printf("Error1, 手机号码长度错误");
getchar();
getchar();
//错误处理省略
return 0;
}
//将结构体指针传过去,填充结构体
p_num = ProcessStruct(phone_num, p_num);
//这个时候p_num就应该指向一个填充了电话号码,运营商识别码,运营商编号,归属地识别码的结构体
p_num = SearchPlace(p_num);
if(p_num == NULL)
{
printf("ERROR3 没有记录");
}
else
{
if(p_num -> carrier)
{
strcpy(carrier, "移动");
}
else
{
strcpy(carrier, "联通");
}
printf("%s %s %s", p_num -> city, p_num -> province, carrier);
}
getchar();
getchar();
getchar();
return 0;
}
char *ConnectPath(int carrier,int addr_order)
{
char path[60] = {'\0'};
if(carrier)
{
strcat(path, yidong_path);
strcat(path, file_name[addr_order]);
strcat(path, yidong_file_ext);
}
else
{
strcat(path, liantong_path);
strcat(path, file_name[addr_order]);
strcat(path, liantong_file_ext);
}
return path;
}
struct phone_num *ProcessStruct(char *phone_num, struct phone_num *p_num)
{
int j;
//传过来的号码变量复制到结构体
strcpy(p_num -> phone_num, phone_num);
//分离运营商识别码
p_num -> carrier_id[0] = p_num -> phone_num[1];
p_num -> carrier_id[1] = p_num -> phone_num[2];
//分离城市识别码
for(j = 0;j < 4;j++)
{
p_num -> city_id[j] = p_num -> phone_num[j + 3];
}
//写入运营商信息
p_num -> carrier = CheckCarrier(p_num -> carrier_id[0], p_num -> carrier_id[1]);
return p_num;
}
//移动的电话号码规律
//134 135 136 137 138 139 158 159
//联通的电话号码规律
//130 131 132 133 153 156
//移动 return 1 联通 return 0
int CheckCarrier(char char1, char char2)
{
//char char1, char2;
//char1 = num.carrier_id[0];
//char2 = num.carrier_id[1];
if(char1 == '3')
{
if((char2 == '4')||(char2 == '5')||(char2 == '6')||(char2 == '7')||(char2 == '8')||(char2 == '9'))
{
return 1;
}
else
{
return 0;
}
}
else
{
if((char2 == '8')||(char2 == '9'))
{
return 1;
}
else
{
return 0;
}
}
}
int Char2Int(char c)
{
int num;
num = c - '0';
return num;
}
struct phone_num *SearchPlace(struct phone_num *p_num)
{
FILE *fp1, *fp2;
int addr_order = 0;
int i, j = 0;
char path[60];
char line[35];
//p是用来处理汉字用的
char *p;
char tmp[10];
int line_num = 0;
int flag = 0;
int number, number1, number2;
//逐文件的的读取
for(addr_order = 0;addr_order < 31;addr_order++)
{
//获取文件夹中文件的路径
strcpy(path, ConnectPath(p_num -> carrier,addr_order));
//使用fp1和fp2是担心 fgets函数不知道把指针给移到哪去了。。
printf("读取文件 %s\n", path);
fp1 = fopen(path, "r");
if(fp1 == NULL)
{
printf("ERROR2 %s 文件打开错误",path);
getchar();
return 0;
}
//获取这个文件有多少行
while((fgets(line, 35, fp1)) != NULL)
{
if(line[strlen(line) - 1] == '\n')
{
line_num++;
}
}
fclose(fp1);
fp2 = fopen(path, "r");
//逐行的去读取文本内容 保存在line里面
for(i = 0;i < line_num;i++)
{
//获取的一行的信息应该是这样的
//13003000000-13003009999-合肥
//运营商识别是line[1]和[2] 然后3,4,5,6是归属地识别
// line[13]和[14] 15,16,17,18
fgets(line, 35, fp2);
//如果运营商识别码不一致 就读取下一行
if(!(line[1] == p_num -> carrier_id[0] && line[2] == p_num -> carrier_id[1]))
{
continue;
}
else
{
//把手机号码的归属地识别转换为数字
number = Char2Int(p_num -> city_id[0]) * 1000 + Char2Int(p_num -> city_id[1]) * 100 + \
Char2Int(p_num -> city_id[2]) * 10 + Char2Int(p_num -> city_id[3]);
//把读出来的归属地识别码转换成数字
number1 = Char2Int(line[3]) * 1000 + Char2Int(line[4]) * 100 + Char2Int(line[5]) * 10 + \
Char2Int(line[6]);
number2 = Char2Int(line[15]) * 1000 + Char2Int(line[16]) * 100 + Char2Int(line[17]) * 10 + \
Char2Int(line[18]);
//电话号码在那个范围内
if(number >= number1 && number <= number2)
{
//下面的要注意 汉字是双字节的 不能直接复制使用啊~~
//如果是len是29 说明城市是两个字的
//接下来把识别的归属地信息保存到结构体中
//p指向第24个位置,那是汉字第起点,然后这一行是以/n/0结束的,所以查找\n然后复制到tmp中
p = &line[24];
while(*p != '\n')
{
tmp[j] = *p;
j++;
p++;
}
tmp[j] = '\0';
strcpy(p_num -> city, tmp);
//把省复制到结构体中
strcpy(p_num -> province, file_name[addr_order]);
flag = 1;
break;
}
else
{
continue;
}
}
}
if(flag == 1)
{
break;
}
}
fclose(fp2);
if(flag == 0)
{
return NULL;
}
else
{
return p_num;
}
}
python版本
这就是python和c语言的区别,同一个项目,使用c开发使用了半天,300多行代码(包括注释),而python开发,30多行代码,用了一个 小时。不过python也有自己的缺点,就是运行慢啊,而且一些方面不能代替别的语言。选择合适的开发工具和环境是多么的重要,这就是在节省生命啊~~
# -*- coding: UTF-8 -*-
import os
#手机号码
phone_num=raw_input("请输入手机号码: ")
while(len(phone_num) != 11):
print"Error1 手机号码长度错误"
phone_num=raw_input("请重新输入手机号码: ")
#将手机号码中归属地识别码转换为数字 方便进行比较
num_id = int(phone_num[3])*1000+int(phone_num[4])*100+\
int(phone_num[5])*10+int(phone_num[6])
#用来保存文件路径
file_path=[]
#将这个文件夹中所有的文件名保存在列表中
file_path.extend(os.listdir("d:\\phone_num_data"))
flag=0
#逐个的读取文件
for i in range(0, 61, 1):
f=open("d:\\phone_num_data\\"+file_path[i], "r")
print "Reading %s"%file_path[i]
line_text=f.readlines()
#这就是一行的内容
for line in line_text:
#要识别两个归属地识别码,然后转换为数字
num_id1=int(line[3])*1000+int(line[4])*100+int(line[5])*10+int(line[6])
num_id2=int(line[15])*1000+int(line[16])*100+int(line[17])*10+\
int(line[18])
if (num_id>=num_id1 and num_id<=num_id2):
flag=1
break
if flag==1:
break
print "%s的归属地是 %s%s%s"%(phone_num, file_path[i][0:len(file_path[i])-8].decode('gbk').encode('utf-8'),\
line[24:len(line)].decode('gbk').encode('utf-8'),file_path[i][len(file_path[i])-4:len(file_path[i])-8].decode('gbk').encode('utf-8'))
但是呢,今天又看到别人写的代码,这么短,,,慢慢的学习 先记下来~~
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *fp1,*fp2;
int i=0;
char num1[20],num2[20],des[20];
char num[20],s[50],temp[50],t[30];
system("DIR /D D:\\手机归属地查询\\Debug\\文件/s /B >> D:\\手机归属地查询\\Debug\\文件路径.txt");
if((fp1=(fopen("d:\\手机归属地查询\\Debug\\文件路径.txt","r")))==NULL)
{
printf("没有找到文件fp1!\n");
exit(1);
}
printf("输入电话号码:");
gets(num);
while(feof(fp1)==NULL)
{
fscanf(fp1,"%s",s);
if((fp2=(fopen(s,"r")))==NULL)
{
printf("没有找到文件fp2!\n");
exit(1);
}
while(!feof(fp2))
{
fscanf(fp2,"%[0-9]-%[0-9]-%s\n",num1,num2,des);
if(strcmp(num1,num)<=0 && strcmp(num2,num)>=0)
{
printf("%s\n",des);
sscanf(s,"%29s%s",t,temp);
printf("%s\n",temp);
return 0;
}
}
}
printf("找不到!\n");
fclose(fp1);
fclose(fp2);
return 0;
}