質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

解決済

文字列比較の条件式について

syachi
syachi

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

3回答

0リアクション

1クリップ

616閲覧

投稿2022/07/20 03:55

各行に1単語が羅列している辞書ファイルをコマンドラインから読み取り、標準入力に単語を入力すると二部探索で入力した単語の行数を探し、行数を返すコードです。
質問は、ファイルにない単語を入力した場合、-1を返すように書かなければならないのですが、60行目あたりの条件文でelseのときに-1をzに代入したらよいと思って、以下のコードのように書きました。
しかし、ファイルにない単語を入力しても何も表示されませんでした。ファイルにある単語は表示されます。何がいけないか教えていただきたいです。
また、6行目のint strCompare...から24行目の部分において、int r~の前の部分は日本語でヒントが与えられており、自分で書いたもので、int r~からの部分は資料に書かれていたコードをそのまま使うように言われました。int r~の部分が何を表しているのか教えていただきたいです。
試したこと:zの初期を-1にしておき、elseの時にzをprintするように書きましたが上手くいきませんでした。

C言語

#include <stdio.h> #include <stdlib.h> typedef struct { unsigned char s[24]; } word; int strCompare(unsigned char *a, unsigned char *b) { while((*a==*b)&&(*a!=0)&&(*b!=0)){ a++; b++; } if (*a<*b){ return -1; }else if(*a>*b){ return 1; }else if(*a==*b){ return 0; } int r = *a - *b; while((r == 0) && (*a != 0)) { a++; b++; r = *a - *b; } return r; } int main(int argc, char **argv) { int i,c,k; unsigned char t[24]; word dict[110000]; FILE *fp; if (argc < 2) { 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++; k=0; } else { dict[i].s[k] = c; k++; } } fclose(fp); int z; int a, b, m; while(scanf("%s",t)!=EOF){ a=0;b=110000; while(a<b){ middle=(a+b)/2; if(strCompare(dict[m].s, t)==0){ z=m+1; break; }else if (strCompare(dict[m].s, t)>0){ b=m; }else if (strCompare(dict[m].s, t)<0){ a=m; }else{ z=-1; } } } printf("%d\n",z); } return 0; }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/08/02 02:11

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

2022/07/20 08:07

こちらの質問が他のユーザーから「過去に投稿した質問と同じ内容の質問」という指摘を受けました。

ozwk

2022/07/20 04:10

そもそもコンパイルエラーになり、問題を再現できません。 質問文のコードを質問文に書いてある問題が起こるコードに修正してください
fana

2022/07/20 04:36

> int r~からの部分は資料に書かれていたコードをそのまま使うように言われました。 何故言われたことすらやらないのです??? > 何がいけないか教えていただきたいです。 てきとーにコードを弄りまわした結果が「上手くいく」可能性に賭けていること,では? ……とか書くと言葉が悪いとか何とか言われそうだけども,要はそういう事でしょう? > 60行目あたりの条件文でelseのときに-1をzに代入したらよいと思って の時点で,いじくる前のコードの意味を把握してないことは明白と見える.
int32_t

2022/07/20 05:07

middle は m の間違いでしょうかね。
dodox86

2022/07/20 06:01

マルチポスト先で既に回答をいただいていたのに、teratailにこの質問を投稿しているようですね。どちらの回答もないがしろにする自分勝手な行為。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。