2016-12-12 4 views
0

文字列内の特定の単語を検索するコードを作成しようとしましたが、文字列内の場所を数えます。 文字列内に単語が存在しない場合は、単語が見つからなかったことを表示する必要があります。 例えば、for文3ワードカウンタのコードをスキップ

int count=0,i=0,j=0,k; 
char word[30]; 
getchar(); 
gets(word); 
k=strlen(word); 
while(arr[i]!='\0'){ 
    if(arr[i]==word[j]){ 
     i++; 
     j++; 
    } 
    i++; 
    if(arr[i]==' ') // moves across a word in the string 
     count++; // count a word the index has passed 
} 
if(j==k)   // if all letters were a match 
    printf("The word %s is placed in the %d place." , word , count); 
else 
    printf("The word %s is not found." , word); 
} 

問題は、すべての文章が入力されたため、それが印刷さということであるべきである「遅」の結果のために、「私は遅れています」:

単語%sが見つかりません。

私はそれが何らかの理由で最初の部分をスキップし、ストレートword is not foundに入ることを想定し、それでもデバッグの後、私はそれがスキップなぜ瞬間とその理由をキャッチできませんでした。

+1

ようこそスタックオーバーフロー! ['gets()'を使わないで、危険です。](http://stackoverflow.com/q/1694036/2173917)。代わりに['fgets()'](https://linux.die.net/man/3/fgets)を使用してください。 –

+0

'word'の文字が' arr'の文字に現れるなら、あなたのコードはテストされているようですが、必ずしも連続している必要はありません。それはあなたが望むものではないので、あなたのコードに他のバグがあるのに加えて、基本的なロジックエラーがあります。コードに内部ループがないようです。あるいは、 'strtok()'を使ってスペースを分割し、 'strtok()'から返された文字列を 'strcmp()'を使って目的の単語と比較することができます。また@SouravGhoshの警告 –

+0

デバッガを使ってステップスルー – pm100

答えて

1

i++は、メインループで2回、条件付きで1回、無条件で表示されます。それが2回現れるという事実は、一致する文字が見つかると、iは、が2回、に増分されることを意味する。あなたのコードの意図は、条件式i++を取り除くことで実現できます。この変更を行い、getchar()(これは入力の最初の文字を捨ててしまったので私の考えでは無意味なようです)を取り除き、fgetsの完全ではない使用でgetsを置き換えると、(削除された行がコメントアウトされて) :私はそれを実行してlateを入力すると

#include <stdio.h> 
#include <string.h> 

int main(void){ 
    int count=0,i=0,j=0,k; 
    char * arr = "I am late"; 
    char word[30]; 
    //getchar(); 
    fgets(word,30,stdin); 
    strtok(word,"\n"); //trick for stripping off newline of nonempty line 
    k=strlen(word); 
    while(arr[i]!='\0'){ 
     if(arr[i]==word[j]){ 
      //i++; 
      j++; 
     } 
     i++; 
     if(arr[i]==' ') // moves across a word in the string 
      count++; // count a word the index has passed 
    } 

    if(j==k)   // if all letters were a match 
     printf("The word %s is placed in the %d place." , word , count); 
    else 
     printf("The word %s is not found." , word); 

    return 0; 
} 

が、私は結果を得る:

The word late is placed in the 2 place. 

ほとんどあなたが望むもののようです(あなたが番号を望んでいた場合はoff-by-oneエラーがあります3)。しかし、あなたが入力mateで再びそれを実行した場合、あなたが得るので、あまりにも早く祝うません:

The word mate is placed in the 2 place. 

(一度この方法を固定)あなたのコード入力単語の文字が順に表示されている場合、実際にテストしていますarrが表示されますが、文字が隣り合っているかどうかは確認されません。あなたはあなたのアプローチを再考する必要があります。

+0

また、2つの文字が一致しない場合、OPはjを0に戻して、2番目の問題を避けるようにしてください。 – Chimera

+0

最終的に私は、単語[j]!= EOFという条件を追加した後に、私が望む結果を得ました。あなたの答えをありがとう – BellaconBud

関連する問題