• ベストアンサー

C言語のアルゴリズムについて

C言語で「標準入力から英語の文章を読み込んで,文字列Ilmorが出現した行をその行番号とともに表示するプログラムを作りなさい.」とプログラムを作りたいのですが、文字列を発見するところまでは分かるのですが、その行どうやって表示すればいいのか分かりません。また、文章を読み込むのもすごくややこしく最後にエンターを二回押すなどの制限があります。(scanf) 参考になるプログラムを書いていただける方いませんか?できればC言語のアルゴリズムについて詳しく書いた本やサイトがあれば教えていただきたいです。 レベルは超入門的な本を2,3冊読んだ程度です。アルゴリズムなどにはまったく触れてなかったし、ライブラリー関数も少ししか載ってなかったので関数の本もあれば教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

 教えて!goo初心者にはありがちなので一応書きますが、回答をもらったらお礼なり補足なりを書きましょう。特に新たな回答が欲しい場合は、補足を書かないと回答する側も書きにくいものです。  (scanf)とありますが、scanfでやらなければならないのですか?  scanfによる文字列読み込みでは、空白文字を読み込むことができません。もしEnterキーを押すまでを1行として処理するのであれば、それなりに面倒な処理が必要になりますよ。 # ここから下は、ちょっと高度になりますが。。。  全文入力後に該当行の表示になると思いますが、全文をバッファに溜めた後で処理をするのはメモリのムダなので、1行読み込むたびに「Ilmor」のチェックを行い、含んでいた場合のみ必要な分のメモリを確保して保存するようにします。  この際行番号も保存できるように、構造体で保存するといいでしょうね。  また随時メモリ確保するので、構造体ポインタ配列などでは処理できないため、自己参照ポインタをメンバに含め、チェーン構造にする必要があります。 (分からない用語などは、別に質問立てるなどしてください。)  で、アルゴリズム云々についてですが、こんな細かいことまで書いた本など恐らく存在しません。あるのは定石について書かれた本だけです。  言語機能や関数群について書かれた本はそれなりに出ています。ちなみに私は「SOFTBANK 新C言語入門 シニア編 林晴比古著」を使っています。リファレンスとしては役に立つでしょう。

touch_me_8
質問者

お礼

ご忠告ありがとうございます。回答については、意味がわからないので、とりあえずキ-ワードを元に調べてみようと思います。アルゴリズムに関する本も持ってないので「SOFTBANK 新C言語入門 シニア編 林晴比古著」を買ってみようと思います。

touch_me_8
質問者

補足

#include<stdio.h> #include<string.h> #define FOUND 0 kensaku(int cnt,char) { char *pa ='I','m','o','r';//検索する文字列 char b[5000];//検索される文字列 char *pb; char c;//仮置き int n; int m; int cnt=1; pb = b; printf("input strings : "); scanf("%s",pb); printf("pa -> %s\n",pa); n = strlen(pa); m = strlen(pb); for(i=0;i<=n-m;i++) { if ((c=getchar(*pb))=='\n') cnt++; if (strncmp(pa+i,pb,m) == FOUND) return(cnt, );//行番号、内容の値を返す。 } } 一応ソースを自分で書いてみたんですが、問題が2つあってscanf関数で読み込むとエンターを押したらそこで終了だから、一行しか読み込めないし。その行の内容をどうやったら、返せるのかってことなんですけど。あと、気になるのがreturn文が実行されるとそこで終了するとか本に書いてあったような?と言ううことはループにしてはダメなんですか?

その他の回答 (2)

  • sho_ta
  • ベストアンサー率7% (2/26)
回答No.3

その昔 MS-Dos で Cやった事有るだけなのであいまいな記憶です。 標準入力から scanf で読み込もうとすると確か 256文字までしか出来無かったような気がするのですか゛... その対策として getch かなんかで一文字ずつ読み込んで、文字列型の配列連結していった方が良いのでは? 多分こんな感じで良いのでは.... intLineno=0 while(true){ strbuff=intLineno++ & ":"; while((ch=getch()) != "\n"){ strbuff = strbuff + (char)ch; .... } //ここで strbuff 内を調べて 任意の文字列が有るか確認する。 funcAAA(strbuff,"Ilmor"); } void funcAAA(char *buff, char *check){ //探せは文字列内より任意の文字を検索する標準関数とか有るのでは? } 【捕捉】 入門用の書籍も有効ですが、標準関数の辞書的な本も有った方が良いですよ。

回答No.1

「作りなさい」って、学校の演習問題っぽいので、そのまま使えるプログラムをご提示するのは躊躇われます。ヒントだけ。 (出現する文字列に関わらず)「すべての行に行番号を付け表示するプログラム」というのは読んだ本に載っていませんでしたか?行番号をつけて表示する部分を、条件に合うときだけ表示するようにすると、目的のプログラムはできそうですよね? 出力は(f)printfを使っていいなら出力は簡単にできます。文字列を発見する方法はわかっているとのことですので、頑張ってください。

touch_me_8
質問者

補足

 「すべての行に行番号を付け表示するプログラム」は本に載っていません。すべての行に行番号をつけると言うのは二次元配列を使うと言うことですか?一つ目の添え字を行番号にして、二つ目の添え字に文字を格納するのですか?そうすると、表示させるときは行番号はいいとして、二つ目の添え字のところは何を指定すればいいのですか。

関連するQ&A