C言語 テキストから指定の文字列を検索するプログラムについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ksk0629
記事: 16
登録日時: 10年前

C言語 テキストから指定の文字列を検索するプログラムについて

#1

投稿記事 by ksk0629 » 10年前

はじめまして。
よろしくおねがいします。

入力したテキストから指定した文字列を検索して、一個目の先頭アドレスを出力する関数を作っています。
現在

コード:

#include <stdio.h>
#define N 100
#define M 10

main() {

  char text[N]; //元
  char cs[M]; //検索する文字
  char *pt;
  char *pc;
  char *add;
  char s[M];

  printf("文字列を入力してください\n");
  scanf("%s", text);

  printf("検索する文字列を入力してください\n");
  scanf(" %9s", cs);

  printf("検索します");
  pt = &text[0];
  pc = &cs[0];

  
  while(*pt != '\0') {

    if(*pt == *pc) {
      add = pt;

      for(add = pt; *pt == *pc; ++pt, ++pc) {

	if(*pc == '\0') {
	  printf("先頭アドレスは %p です", add);
	  return(0);
	}
 
	else if (*pt != *pc)
	  pc = &cs[0];
      }
    }
  }

  printf("存在しません");
}
  
ここまで作りましたが、
2つめのscanfである
scanf(" %9s", cs);
に到達して、文字列を入力、エンターキーを押しても先に進みません。
どこを直せば良いのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: C言語 テキストから指定の文字列を検索するプログラムについて

#2

投稿記事 by みけCAT » 10年前

ksk0629 さんが書きました:ここまで作りましたが、
2つめのscanfである
scanf(" %9s", cs);
に到達して、文字列を入力、エンターキーを押しても先に進みません。
(i)textとcsの1文字目が違う場合(例: text="aaa", cs="b")
(*pt == *pc)が偽なので、25行目のwhile文の中で実質何もせず、無限ループになってしまいます。

(ii)textとcsの1文字目が同じで、textとcsが異なり、textがcsの接頭辞になっていない場合(例: text="aaa", cs="a")
30行目のfor文で(*pt == *pc)が偽になるまでptとpcがインクリメントされます。
(*pt == *pc)が偽になるとfor文を抜けますが、(i)と同様に無限ループになってしまいます。

(iii)textとcsが同じ場合(例: text="aaa", cs="aaa")
30行目のfor文でループします。
*pc=='\0'かつ*pt=='\0'になると、33行目と34行目が実行され、終了します。

(iv)textとcsが異なり、textがcsの接頭辞になっている場合(例: text="aaa", cs="aaaa")
30行目のfor文で(*pt == *pc)が偽になるまでptとpcがインクリメントされます。
この後、*pt=='\0'になるので、25行目の条件が偽になり、43行目を実行して終了します。
ksk0629 さんが書きました:どこを直せば良いのでしょうか?
まずインデントを直し、main関数の宣言をint main(void)にするといいでしょう。
さらに、
  • 27行目、28行目、39行目、40行目を削除
  • 30行目を

    コード:

    for(add = pt; *pc != '\0' && *pt == *pc; ++pt, ++pc);
    に変更
  • 38行目の後に

    コード:

    pt = add + 1;
    を追加
これでうまく動きそうだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ksk0629
記事: 16
登録日時: 10年前

Re: C言語 テキストから指定の文字列を検索するプログラムについて

#3

投稿記事 by ksk0629 » 10年前

みけCATさん本当にありがとうございます!
いつもfor文で書いているのでwhileのループチェックが甘かったです。

ご指摘ありがとうございます!

本当にありがとうございます!!!

閉鎖

“C言語何でも質問掲示板” へ戻る