2010-04-27 59 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

呃。 Fortran77已經死了。你可以請使用更好的變量名稱。你讓我的頭受傷:) – 2010-04-27 20:42:11

+0

@Michael Dorgan:我承認最​​近去年在FORTRAN 77專業編程。但是,我認爲i,j,k是完全合法的循環控制變量。較短的可視範圍證明了短變量名稱IMO的作用。 – 2010-04-27 20:45:14

+0

我對我沒有問題。我不會在j打一個睫毛。我,jk,正在推動它 - 特別是在循環上下文環境中,事情開始變得混亂。 – 2010-04-27 20:47:02

回答

2

您需要使用strncmp而不是strcmp,並將比較長度設置爲strlen(search)。無論是或者你可以用'\0'來終止溫度。

2

那麼,首先,「temp」在第二種情況下不會被終止。這就是爲什麼你的第一個案件有效;如果你搜索「好」,它將無法工作。

+0

好抓!這可能已經釘牢了。 – 2010-04-27 20:50:59

1

如果你想完全避免strcmp,你已經完成了99%的工作。在比較循環退出時,只需檢查j對抗令牌/搜索字符串的長度,就會知道是否有匹配。