各行に1単語が羅列している辞書ファイルをコマンドラインから読み取り、標準入力に単語を入力すると二部探索で入力した単語の行数を探し、行数を返すコードです。
質問は、ファイルにない単語を入力した場合、-1を返すように書かなければならないのですが、60行目あたりの条件文でelseのときに-1をzに代入したらよいと思って、以下のコードのように書きました。
しかし、ファイルにない単語を入力しても何も表示されませんでした。ファイルにある単語は表示されます。何がいけないか教えていただきたいです。
また、6行目のint strCompare...から24行目の部分において、int r~の前の部分は日本語でヒントが与えられており、自分で書いたもので、int r~からの部分は資料に書かれていたコードをそのまま使うように言われました。int r~の部分が何を表しているのか教えていただきたいです。
試したこと:zの初期を-1にしておき、elseの時にzをprintするように書きましたが上手くいきませんでした。
C言語
1#include <stdio.h> 2#include <stdlib.h> 3typedef struct { 4 unsigned char s[24]; 5} word; 6int strCompare(unsigned char *a, unsigned char *b) { 7while((*a==*b)&&(*a!=0)&&(*b!=0)){ 8 a++; 9 b++; 10 } 11 if (*a<*b){ 12 return -1; 13 }else if(*a>*b){ 14 return 1; 15 }else if(*a==*b){ 16 return 0; 17 } 18int r = *a - *b; 19while((r == 0) && (*a != 0)) { 20a++; b++; 21r = *a - *b; 22} 23return r; 24} 25int main(int argc, char **argv) { 26 int i,c,k; 27 unsigned char t[24]; 28 word dict[110000]; 29 FILE *fp; 30 31 if (argc < 2) { 32 fprintf(stderr,"usage: ./a.out dictFile\n"); exit(1); 33 } 34 if ((fp=fopen(argv[1],"r")) == NULL) { 35 fprintf(stderr,"cannot open file %s\n",argv[1]); exit(1); 36 } 37 i=0; k=0; 38 while((c=fgetc(fp)) != EOF) { 39 if (c == '\n') { 40 dict[i].s[k] = 0; 41 i++; 42 k=0; 43 } else { 44 dict[i].s[k] = c; 45 k++; 46 } 47 } 48 fclose(fp); 49 int z; 50 int a, b, m; 51 while(scanf("%s",t)!=EOF){ 52 a=0;b=110000; 53 while(a<b){ 54 middle=(a+b)/2; 55 if(strCompare(dict[m].s, t)==0){ 56 z=m+1; 57 break; 58 }else if (strCompare(dict[m].s, t)>0){ 59 b=m; 60 }else if (strCompare(dict[m].s, t)<0){ 61 a=m; 62 }else{ 63 z=-1; 64 } 65 } 66 } 67 printf("%d\n",z); 68 } 69 return 0; 70} 71

回答3件
あなたの回答
tips
プレビュー