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

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

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

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2391閲覧

BM法について。

Gogetsu_azusa

総合スコア13

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/09/26 13:32

編集2015/09/26 13:35

こんにちは。2度目の質問です。
現在、課題でBM法を作ってます。ところが、途中でつまづきました。
以下がプログラムの一部です。
ーーーーーーー
char *Text; /テキストの文字列/
char *Pattern; /パターンの文字列/

int Tnum,Pnum; /*それぞれの文字数*/ printf("What is Text?"); printf("1"); scanf("%s",Text); printf("2"); printf("Text=%s\n",Text); printf("3"); Tnum=strlen(Text); printf("4"); printf("Text number=%d\n",Tnum); printf("5"); printf("What is Pattern?"); printf("1"); scanf("%s",Pattern); printf("2"); printf("Pattern=%s\n",Pattern); printf("3"); Pnum=strlen(Pattern); printf("4"); printf("Pattern number=%d\n",Pnum); printf("5");

ーーーーーーー
そうすると、実行結果が以下のようになります。
イメージ説明
printfで1~5まで表示されているのは、どこまで正しく実行されるかを表すもので、内容には関係ありません。気になるのは、なぜTextの文は正しく実行されて、Patternの文は正しく実行されないのかというところです。
TextとPatternのそれぞれの塊の前後を変えると、Patternは実行され、Textは実行されません。
回答の程宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問文に乗っているコードにはメモリが確保されていないことを除けば正しい様に見えます。
自分の環境でも適切にメモリ確保したコードで試したところ問題ありませんでした。
そのコードの前の部分を見てみないと大したことはわからないですね。

投稿2015/09/26 15:15

_nyannyan_

総合スコア124

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

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

Gogetsu_azusa

2015/09/27 05:01

ありがとうございます。 参考になりました^^
guest

0

Text、Patternはそれぞれポインタで定義されていますが、これらの変数が初期化されていません。
文字列を読み込むには、文字列を格納する場所が必要です。
例えば、
char text_mojiretu[64]; // 文字を格納する場所を63文字分(文字列の最後には'\0'が入る)確保する
char pattern_mojiretu[64]; // 同じく文字を格納する場所を63文字分確保する

Text = text_mojiretu;
Pattern = pattern_mojiretu;
とするか。

または、直接
char Text[64];
char Patter[64];

と、定義すれば良いと思います。

文字列の入力には、注意が必要です。
上記でサイズを64としまたが、63文字以上の文字を入力すると、この領域を超えてしまうため他の領域が壊されてしまいます。

投稿2015/09/26 14:56

akiruno-oneone

総合スコア815

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

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

Gogetsu_azusa

2015/09/27 01:05

御解答ありがとうございます。 BM法ということで、文字列探索を行うので、中身を中身を比べることが大事なんですが、その場合は貴方の御解答の、前者の方法と後者の方法、どちらがいいでしょうか。
akiruno-oneone

2015/09/27 02:04

どちらにするかは、BM法というよりプログラムの設計をどうするかだと思います。 例えば、以下のようにプログラムを作成したとします。 1. 文字列を入力する。 2. 入力された文字列から、BM法による文字列サーチを行う。 3. 結果を出力する。 #define BUFFER_SIZE 128 main() { char text[BUFFER_SIZE]; char pattern[BUFFER_SIZE]; int pos; ... // 文字入力 scanf("%s", text); ... // BM法サーチ pos = bm_search(text, pattern); // 結果を出力 ... } 上記のようにプログラムを作成した場合、textは文字列を格納するだけであるため、わざわざポインタにする必要はありません。 BM法部分をサブルーチンとせずに、mainに埋め込んだ場合、その部分でポインタとして必要であれば、そのときにポインタに代入すれば良いと思います。
Gogetsu_azusa

2015/09/27 05:01

ありがとうございました。 かなり参考にさせていただきます^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問