//求挑毛病
//这个项目的最大的收获就是汉字的编码和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;
}