2012-02-17 31 views
1

程序檢查第二個字符串是否是第一個字符串的子字符串。它爲所有情況顯示「是」,而且,當我將第二個字符串作爲'q ** q'時,我得到一個運行時錯誤,爲什麼它是這樣的? *代表任何信件。程序檢查子字符串。有什麼問題

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
int main() 
{ 
    char str1[20], str2[20]; 
    int l1, l2, i1, i2=0; 
    gets(str1); 
    gets(str2); 
    l1=strlen(str1); 
    l2=strlen(str2); 
    if(l1>=l2) 
    { 
     for(i1=0; i1<=l1-l2+i2, i2<l2; i1++) 
     { 
      if(str2[i2]==str1[i1]) 
      i2++; 
     } 
     if(i2==l2) 
      printf("Yes"); 
     else 
      printf("No"); 
    } 
    else 
     printf("No"); 

    getch(); 

    return 0; 
} 
+1

是您的代碼縮進真的這樣?首先修復它,它會更具可讀性。 – 2012-02-17 18:35:22

+0

你可以在'string.h'中使用函數'char * strstr(const char * s1,const char * s2)'define [link](http://www.edcc.edu/faculty/paul.bladek/c_string_functions熱媒)。或者你正試圖達到這個目的以學習和練習C? – 2012-02-17 18:36:43

+0

要找到這樣的錯誤,你應該使用一個調試器,並查看錯誤發生的位置,此外,儘量不要使用變量與l和1,它看起來是相同的,它很混亂。我建議你閱讀「完整的代碼」,這是一本很好的書,它將爲你提供代碼可讀性的最佳實踐 – stdcall 2012-02-17 19:03:14

回答

4

for語句

for(i1=0; i1<=l1-l2+i2, i2<l2; i1++) 

真的沒有意義的條件。代碼i1<=l1-l2+i2, i2<l2評估逗號前的部分,丟棄結果,然後評估逗號後的部分。可能你打算寫i1<=l1-l2+i2 && i2<l2

0
int substring(char *s,char *t) 
     { 
       int i, j, k; 

       for (i = 0; s[i]; i++) 
       { for (j = i, k = 0; t[k] && s[j] == t[k]; j++, k++) 
         ; 
        if (k > 0 && !t[k]) 
         { 
          return i; 
         } 

         return -1; 
       } 
     } 

這是工作代碼... 作爲您的解決方案失敗的 輸入字符串 - anshulanananans,搜索字符串 - anans