#include<stdio.h>
#include<ctype.h>
struct adnum
{
char ad[1000]; /*存储地址和号码*/
char num[12];
} dz[10000];
void main()
{
int i,j,k=0;
FILE*yw , *dw, *nw;
char fyw[50],fdw[50],fnw[50],put[100000];
printf("请输入原文本路径:\n");
scanf("%s",fyw);
printf("请输入地址路径:\n");
scanf("%s",fdw);
printf("请输入号码路径:\n");
scanf("%s",fnw);
yw=fopen(fyw,"r");
dw=fopen(fdw,"w");
nw=fopen(fnw,"w");
fseek(yw,0L,SEEK_END); /* 获取原文本的字节大小 */
int size=ftell(yw);
rewind(yw);
for(i=0;i<size;i++)
fread(&put[i],1,1,yw); /* 把原文本的数据转录到数组put */
for(i=0;i<size;i++) /* 把数组put里边的号码提取出来,转存到结构体数组dz.num里边。 */
{
if(put[i]==49&&put[i+1]<58&&put[i+1]>46&&put[i+2]<58&&put[i+2]>46&&put[i+3]<58&&put[i+3]>46&&put[i+4]<58&&put[i+4]>46
&&put[i+5]<58&&put[i+5]>46&&put[i+6]<58&&put[i+6]>46&&put[i+7]<58&&put[i+7]>46&&put[i+8]<58&&put[i+8]>46&&put[i+9]<58&&put[i+9]>46&&put[i+10]<58&&put[i+10]>46)
{ for(j=0;j<11;j++)
dz[k].num[j]=put[i+j];
dz[k].num[11]='\n';
k++;
}
}
for(i=0;i<k;i++)
fputs(dz[i].num,nw);
for(i=1;i<size;i++) /*把数组put里边的地址提取出来,转存到结构体数组dz.ad里边。 */
if(put[i-1]==64)
{
for(j=0;put[j+i]!=44;j++)
dz[k].ad[j]=put[i+j];
dz[k].num[j+1]='\n';
k++;
}
for(i=0;i<k;i++)
fputs(dz[i].ad,dw);
fclose(dw);
fclose(nw);
fclose(yw);
}
第一个问题是能够正常的获取手机号码,地址也能获取,问题是获取完后,最后的一个地址后边是一大串乱码,怎么改正?
第二个问题是,判断是不是手机号码的if语句太长了。。。自己没想到好的办法啊,能不能想办法改正一下。
第三个问题是,如何直接将地址和号码直接弄到一个文件里?格式大概如下:
地址1,号码1
地址2,号码2
原文件
输出的地址文件
输出的号码文件
红旗街百脑汇后,2室1厅,2/6,58.5 ,私
人产权,40万元,电话:15004318950。
建设街西安大路,2室1厅,4/7,南北向,
59.02 ,私人产权,43万元,电话:
15330608678。
上面是要处理的文本,如何把地址和电话号码提取出来,我的想法是句号和逗号中间是地址,例如”电话:15004318950。建设街西安大路,“,就用if语句来判断。然后。。。不知道中文的句号和逗号的ASCII码值,就把句号替换成了@,把中文的逗号替换成了英文的。有没有更好的方法解决这个问题?即不用替换逗号,句号,冒号。这个是附加问题了,答不答无所谓。
问题一, 在取地址的程序中, 头尾的判断不一致. 按照图片中的片段, 末尾应是'@', 但是程序却当成起头.
除了末尾会有乱码外, 起头第一笔地址, 应该也会有遗漏的问题.
问题二, 可以从(1)写法(2)呼叫函式来改善. C语言是结构化语言, 程序中没有用到函式, 其实并没有发挥出效用.
但是要使用其他的方式, 对於Pointer及Array的使用要更清楚, 才不易错误.
(1)写法
if( put[i]==49 && put[i+1]<58 &&(2)呼叫函式
if( is_string_phone_num(&put[i]) == true ) //替代一大串ps. 先改善程序的可读性, 若是想改善写法, 再来另外处理函式内容.
问题三, 其实地址跟电话, 可以在第一次循序读档时一起读取, 当前因为分别采用两种不同的判断方式, 导致无法一起处理. 先从文档架构的固定顺序上来看, 可以先这样假设.(实际上并不太好, 但是从原有架构上, 可以先这样逐步演化, 再慢慢调整解法)
for(i=0;i<size;i++)所有的程序问题, 都是先拆解成小方块, 再逐一解决单一问题, 如此将容易许多了.
关於中文, 实际上每一个字都是双字节, 处理上会稍稍麻烦一些, 但是依照拆解原则, 先写成一个函式, 再来单单思考双字节判断问题, 就会感觉容易了. 希望以上会有帮助.