各行に1単語が羅列している辞書ファイルをコマンドラインから読み取り、標準入力に単語を入力すると二部探索で入力した単語の行数を探し、行数を返すコードです。
標準入力が終わるまで入力と出力を繰り返し、Ctrl+Dで終了します。
質問はファイルにない単語を入力した場合、-1を返すように書かなければならないのですが、60行目あたりの条件文でelseのときに-1をzに代入したらよいと思って、以下のコードのように書きました。
しかし、ファイルにない単語を入力しても何も表示されません。ファイルにある単語を入力すると行数は表示されます。何が原因なのかご指摘いただきたいです。
また、6行目のint mojiretsu...から24行目は授業で提示されたコードなのですが、18行目からの部分は何を表しているのか教えていただきたいです。
試したこと:zの初期を-1にしておき、elseの時にzをprintするように書きましたが上手くいきませんでした。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
unsigned char s[24];
} word;
int mojiretsu(unsigned char *a, unsigned char *b) {
while((*x==*y)&&(*x!=0)&&(*y!=0)){
x++;
y++;
} //10行目
if (*x<*y){
return -1;
}else if(*x>*y){
return 1;
}else if(*x==*y){
return 0;
}
int r = *x - *y;
while((r == 0) && (*x != 0)) {
x++; y++; //20行目
r = *x - *y;
}
return r;
}
int main(int argc, char **argv) {
int i,c,k;
unsigned char t[30];
word dict[220000];
FILE *fp;
if (argc < 2) { //30行目
fprintf(stderr,"usage: ./a.out dictFile\n"); exit(1);
}
if ((fp=fopen(argv[1],"r")) == NULL) {
fprintf(stderr,"cannot open file %s\n",argv[1]); exit(1);
}
i=0; k=0;
while((c=fgetc(fp)) != EOF) {
if (c == '\n') {
dict[i].s[k] = 0;
i++; //40行目
k=0;
} else {
dict[i].s[k] = c;
k++;
}
}
fclose(fp);
int z;
int a, b, middle;
while(scanf("%s",t)!=EOF){ //50行目
a=0;b=110000;
while(a<b){
m=(a+b)/2;
if(moji(dict[middle].s, t)==0){
z=middle+1;
break;
}else if (moji(dict[middle].s, t)>0){
b=m;
}else if (moji(dict[middle].s, t)<0){
a=m; //60行目
}else{
z=-1;
}
}
printf("%d\n",z);
}
return 0;
}