Работает для короткого ввода, сбой для длинного ввода. Как решить? - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть эта программа, которая находит подстроку в строке. Это работает для небольших входов. Но терпит неудачу для длинных входов. Вот программа:

//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

Что совершенно неправильно. Может ли какой-нибудь эксперт найти мне решение?

P.S: Это все равно что заново изобретать колесо, так как strstr () обладает этой функциональностью. Но я пытаюсь найти небиблиотечный способ сделать это.

Ответы [ 3 ]

2 голосов
/ 28 апреля 2010

Ну, для начала, "temp" не будет завершаться нулем во втором случае. Вот почему ваш первый случай работает; это не сработало бы, если бы вы искали "хорошо".

2 голосов
/ 28 апреля 2010

Вам нужно использовать strncmp вместо strcmp и установить длину сравнения равную strlen(search). Либо так, либо вы можете просто прекратить temp с помощью '\0'.

1 голос
/ 28 апреля 2010

Если вы хотите полностью избежать strcmp, вы уже выполняете 99% его работы. Просто проверьте j по длине токена / строки поиска при выходе из цикла сравнения, и вы узнаете, есть ли совпадение.

...