0

文字列内の部分文字列を見つけるこのプログラムがあります。小さな入力で機能します。しかし、長い入力では失敗します。プログラムは次のとおりです。

//Find Substring in given String
#include <stdio.h>
#include <string.h>
main()
{
  //Variable Initialization
  int i=0,j=0,k=0;
  char sentence[50],temp[50],search[50];

  //Gets Strings
  printf("Enter Sentence: ");
  fgets(sentence,50,stdin);
  printf("Enter Search: ");
  fgets(search,50,stdin);

  //Actual Work Loop
  while(sentence[i]!='\0')
  {
    k=i;j=0;
    while(sentence[k]==search[j])
    {
      temp[j]=sentence[k];
      j++;
      k++;
    }
    if(strcmp(temp,search)==0)
      break;
   i++;
  }

  //Output Printing
  printf("Found string at: %d \n",k-strlen(search));
}

対象:

Enter Sentence: good evening
Enter Search: evening
Found string at 6

失敗:

Enter Sentence: dear god please make this work
Enter Search: make
Found string at 25

これは完全に間違っています。専門家は私に解決策を見つけることができますか?

PS: strstr() にはこの機能があるため、これは車輪の再発明のようなものです。しかし、私はそれを行うための非ライブラリの方法を試みています。

4

3 に答える 3

2

You need to use strncmp rather than strcmp and set the comparison length equal to strlen(search). Either that or you could just terminate temp with a '\0'.

于 2010-04-27T20:42:16.593 に答える
2

まず、2 番目のケースでは "temp" は null で終了しません。これが、最初のケースが機能する理由です。「良い」を検索した場合は機能しません。

于 2010-04-27T20:45:06.263 に答える
1

strcmp を完全に回避したい場合は、すでにその作業の 99% を実行しています。比較ループの終了時にトークン/検索文字列の長さに対して j をチェックするだけで、一致するかどうかがわかります。

于 2010-04-27T20:50:57.780 に答える