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

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

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

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

Q&A

解決済

2回答

2840閲覧

文章を入力し、その中から特定の単語を探して、何文字目からそれが始まるかを出力するプログラム

urazome

総合スコア26

C

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

0グッド

1クリップ

投稿2018/12/19 15:55

下のコードを作成したのですが、あと1歩のところで詰まりました。出力結果は、
「・
・ 

単語~は-10750・・・文字目に見つかりました.」
となり、wordsearch関数内に問題があることはわかるのですが、見つけることができませんでした。
お力を貸してください。

C言語

1#include<stdio.h> 2 3/* --- *targetは文章、*keyは探している単語 --- */ 4int wordsearch(char *target,char *key){ 5 int i=0,j,x,y; 6 7 while(1){ 8 if(key[i]==0){   /* 配列keyの文字数を出す*/ 9 x=i+1; 10 break; 11 } 12 i++; 13 }      14 15 for(i=0;i<sizeof(target);i++){ 16 if(target[i]==key[0]){ /* 配列targetのi文字と配列keyの1文字目を照合 */ 17 for(j=1;j<x;j++){ /* 配列keyの文字数回繰り返す */ 18 if(target[j+i]!=key[j]){ /*配列keyの2文字目以降が一致しなかったら、最初に戻り、1文字目をまた照合する*/ 19 break; 20 } 21 else if(target[j+i]==key[j] && j==x-1){ /*配列keyが最後の文字まで通ったら、yにi+1を代入 */ 22 y=i+1; 23 break; 24 } 25 } 26 } 27 } 28 return y; 29 } 30 31int main(void){ 32 char mes[10000]={}; 33 char word[256]={}; 34 int n; 35 printf("文章を入力してください(最大 10000 文字):"); gets(mes); 36 printf("検索する単語を入力してください(最大255文字):"); gets(word); 37 n=wordsearch(mes,word); 38 printf("単語%sは%d文字目に見つかりました.\n",word,n); 39 40 return 0; 41} 42

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

修正の追加です。

  • sizeof(target)はポインタ自体のサイズになるので、文字列の長さにしたいならstrlen(target)です。
  • 検索で見つからなかった場合の文字位置yは不定なので、-1とかで初期化しましょう。
  • gets()は脆弱性の問題があるのでfgets()を使いましょう。

投稿2018/12/20 08:43

shozi3

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urazome

2018/12/20 16:54

回答ありがとうございました! 自分も全く同じ意見です!課題の指示に従ったため、上記の私の不自然なコードになりましたが、より質の高い単語検索のプログラムを作るなら、指摘くださった修正を加えるべきだと思います!
guest

0

ベストアンサー

記載いただいたソースを単純に直すだけであれば、

①wordsearch()の先頭で求めているxが1大きいので、
【修正前】x=i+1;
【修正後】x=i;
に修正。
②wordsearch()の変数jでのfor文で、else ifに入った場合でもbreakして次のループに遷移するようになっているのが誤りで、else ifの中で、
【修正前】break;
【修正後】return y;
に修正。

上記2か所を直せば、とりあえず動くかと思います。

また、以下の関数について調べると、もっと簡単にプログラム記載できますのでお試しください。
strlen
strstr

投稿2018/12/19 16:17

aikon_marimo

総合スコア1083

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urazome

2018/12/20 16:49

回答ありがとうございました! 先の修正を加え、いろいろ修正を加えた結果、正常に動きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問