アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。http://oshiete.goo.ne.jp/qa/5836517.htmlで質問させているものです。

皆さんのアドバイスを頂き、2分探索法で郵便番号から住所を検索するプログラムが出来たのですが、
住所から郵便番号を2分探索法で出すプログラムも同じ方法でやろうとしましたが、比較対象が漢字の為、大きい・小さいの判断できずに上手くプログラムが出来ていません。

csvファイルは読みデータをひとつに繋げてあいうえお順にソートしました

プログラムを一部載せておきます(かなり省略済みですが…)
#define NAME ken_all_address.csv

int main(int argc,char *argv[])
{
struct tb line;
FILE *fp;
char buff[SIZE], string_buff[SIZE];
char *address,*ret;
int flag,linesu,linesu1,sum,count,up,up1,low,low1,center,center1;
int i,j;
long pos[FSIZE];

clock_t start,end;

start = clock();
//引数処理
if((fq=fopen(NAME1,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME1);
return -1;
}

if((fp=fopen(NAME,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME);
return -1;
}

flag = 0;
address = argv[1];

count=0;
sum=0;

if(atoi(address) == 0){
for(i=0; ;i++){
pos[i] = ftell(fq);
ret=fgets( buff, sizeof(buff), fp );

if(ret==NULL){
break;
}
}
linesu = i;

//printf("%d",linesu);

low=0;
up=linesu-1;

while(low <= up){
center=(up+low)/2;
fseek(fq,pos[center-1],SEEK_SET);
fgets( buff, sizeof(buff), fp );

strtok(buff,",\"");
strtok(NULL,",\"");
strcpy(line.now_num,strtok(NULL,",\""));
strtok(NULL,",\"");
strtok(NULL,",\"");
strtok(NULL,",\"");
strcpy(line.kanji1,strtok(NULL,",\""));
strcpy(line.kanji2,strtok(NULL,",\""));
strcpy(line.kanji3,strtok(NULL,",\""));

strcpy(string_buff,line.kanji1);
strcat(string_buff,line.kanji2);
strcat(string_buff,line.kanji3);

printf("%s %s %s\n",line.kanji1,line.kanji2,line.kanji3);

if(strcmp(string_buff,address)==0){
printf("〒%s \n",line.now_num);
flag=1;
}
if(strstr(string_buff,address) ==NULL){
low=center+1;
}
else{
up=center-1;
}
}
}
fclose(fp);

if(flag==0 && atoi(argv[1]) == 0){
printf("「%s」に該当する郵便番号はありませんでした\n",address);
}

if(flag==0 && atoi(argv[1]) != 0){
printf("「%s」に該当する住所はありませんでした\n",address);
}

end = clock();

printf("引数=%s\n",address);
printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
printf("fgetsの実行回数=%d回\n",sum);
printf("比較回数=%d回\n",count);
printf("\n");

return 0;
}

A 回答 (1件)

 strcmpの返り値は文字列を文字コードで比較しての大小関係です。


 ただし、漢字の文字コードは必ずしも「あいうえお順」じゃないので、そのままでは2分探索法では検索出来ないでしょう。

 この場合は普通はデータに「読み方」のフィールドを追加し、そこに住所をひらがな(あるいはカタカナ)で記載し、それを使って2分探索法で検索します。
 別のやり方としては、CSVファイルを「あいうえお順」ではなく「文字コード順」にソートしたものを使って検索する方法もあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!