2010-04-27 5 views
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 

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

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

+0

Ugh. Fortran77 мертв. Можете ли вы использовать лучшие имена переменных. У тебя болит голова :) –

+0

@ Майкл Дорган: Я признаю, что проработал в FORTRAN 77 профессионально еще в прошлом году. Однако, я думаю, что i, j, k - вполне законные переменные управления контуром. Короткие области видимости оправдывают короткие имена переменных, IMO. –

+0

У меня нет проблем с i. Я не буду бить ресницы в j. i, jk, толкает его - особенно вне контекста for loop, где вещи начинают запутываться. –

ответ

2

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

2

Ну, во-первых, «темп» не будет иметь нулевой конец во втором случае. Вот почему ваш первый случай работает; это не сработало бы, если бы вы искали «хорошо».

+0

Хорошая добыча! Это, возможно, прибило его. –

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^