発生している問題
キーボードから入力した文字列中に特定の文字列が含まれているかを検索するため
以下のコードを記述しましたが、
結果が出力されません。
どのように修正すれば宜しいでしょうか。
条件
Nは入力する文字列の数を表します。
Sは特定の文字列 Tは入力する文字列を表します。
文字列は順番通りでなければいけません。
入力された文字列に1文字だけ衍字が含まれている場合は有効とします。
例) 調べる文字列 "take"
入力した文字列 "mistake" valid
"mistook" invalid
"mitaike" valid
C
1#include <stdio.h> 2 3int main(void){ 4 int N,i,j,k; 5 char S[11]; 6 char T[21]; 7 8 scanf("%d",&N); 9 scanf(" %s",S); 10 11 for(i=0;i<N;i++){ 12 scanf(" %s",T); 13 j=0; 14 k=0; 15 while(S[j] != '\0'){ 16 while(T[k] != '\0'){ 17 if(T[k] == S[j]){ 18 while(T[k] != S[j]){ 19 k++; 20 j++; 21 if(T[k] != S[j]){ 22 k++; 23 if(T[k] != S[j]){ 24 k--; 25 k--; 26 j--; 27 break; 28 } 29 } 30 if(S[j+1] == '\0'){ 31 printf("valid\n"); 32 break; 33 } 34 } 35 } 36 k++; 37 } 38 j++; 39 } 40 printf("invalid\n"); 41 } 42 return 0; 43}
各所に printf でマーキングを入れて, どう動いているかを確認しては如何でしょうか.
strstr を使えばいいと思います。
目を疑うコード
if(T[k] == S[j]){
while(T[k] != S[j]){
この while ループは絶対に実行されません。
期待する具体例を挙げてもらえませんか?
例えば N が 3 のとき、S と 3個の T にどんな文字列を与えて、結果がどう表示されてほしいかです。
衍字が含まれ得るのはSなのかTなのか?
(文章では「特定の文字列」すなわちSだと読めるが,例ではT側であるように見える)
>jimbeさん
printfを使用して挙動を確認したところ、2つ目の入力 fgets(S,sizeof(S),stdin);の時点でバグが発生していました。
scanfの後にfgets関数を使用するとfgets関数がscanf関数の改行を読み取る為正常に動作しないというものでした。
これからはprintfで確認してから質問するようにします。ありがとうございます。
>Zuishinさん
strstrを使用する事も考えたのですが、調べる文字列に衍字が含まれる場合のコードの書き方が分からなかったため、このような形にしております。
>kazuma-sさん
なぜこのループは実行されないのでしょうか?宜しければ理由をお聞かせ願えますでしょうか。
具体例としては、
特定の文字列Tが「take」
Sがそれぞれ「mistake」「mistook」「mistaike」と入力されたとすると、
「mistake」には「take」が含まれるので validを出力
「mistook」には「take」が含まれないのでinvalidを出力
「mistaike」は「i」が衍字となりますが、iを無視すると「take」と読めるので validを出力
という形です。
>fanaさん
おっしゃる通り、衍字が含まれ得るのは入力する文字列「T」の方です。
混乱させてしまって申し訳ありません。
T[k] と S[j] が等しい時、 if の中に入ります。そこに while があります。
T[k] と S[j] が等しいので、while の条件「T[k] と S[j] が等しくない」という条件が偽です。
したがって、while の中には絶対に入りません。
> 具体例としては、
> 特定の文字列Tが「take」
> Sがそれぞれ「mistake」「mistook」「mistaike」と入力されたとすると、
S の「mistaike」に衍字が含まれるのですか?
scanf("%s", S); は 1回、scanf("%s", T); は N回実行されますよ。
S と T が逆ですか?
>kazuma-sさん
while文の条件について何故か逆に捉えてしまっていました。勉強し直します。
そしてSとT、また逆になっていますね・・、すいません。1文字で置き換えずに inputdata等に置き換えるようにします。
回答3件
あなたの回答
tips
プレビュー