2011-05-17 201 views
-1

我試圖編寫在某個字符串中搜索字符串的函數。 exmaple: 「qwerty」=>搜索的關鍵 「qasazqertyqwerty」 程序返回1,因爲qwerty在字符串中找到。在字符串中查找字符串

我的代碼功能是:

int normal(char *str, char *str2) 
{ 
    int temp=0; 
    while(*str) 
    { 
     while(*str2) 
     { 
      if(*str == *str2) 
      { 
       temp+=1; 
      } 
      else if(temp == strlen(str2)) 
      { 
       printf("%d", temp/strlen(str2)); 
      } 
      str2++; 
      str++; 
     } 
    } 
return 0; 
} 

到底在程序(邏輯)的問題?

+1

而我想,它不工作......這就是爲什麼你問這個問題嗎? – ALOToverflow 2011-05-17 13:58:33

+0

這功課呢? – 2011-05-17 14:00:04

+3

它是功課嗎?如果不是,請改用strstr。 http://linux.die.net/man/3/strstr – shinkou 2011-05-17 14:00:09

回答

2

正確的答案顯然是使用strtstr。但是,如果您仍然想知道爲什麼您的代碼無法正常工作,那是因爲您在str2上致電strlen,您正在增加該代碼。你應該先在函數的開頭計算它,然後比較temp與它完成比較chararcters。

1

是的,你應該使用strstr()。但要解釋爲什麼你的功能不起作用:

  • 你的函數總是返回0,因爲總是隻有一個返回語句。
  • 如果str小於str2,則會發生segfault,因爲您在內部循環中轉發了兩個指針。
  • 條件溫度== strlen的(STR2)將永遠不會被達到,因爲溫度的增量和str2的長度遞減
0

這裏是一個版本的的strstr()我在某些時候寫的,它應該是MISRA -C兼容,除了最後的演員陣容,這是爲了與C標準的strstr()的定義兼容。前綴_用於表示這些不是來自string.h的庫函數。

uint8* _strstr (const uint8* s1, const uint8* s2) 
{ 
    uint16 length; 
    const uint8* return_val; 

    length = _strlen(s2); 

    if(length == 0) 
    { 
    return_val = s1; 
    } 
    else 
    { 
    sint16 n; 

    n = (sint16) _strlen(s1) + (sint16) 1 - (sint16) length; 

    return_val = NULL; 

    if(n >= 1) 
    { 
     while(n != 0) 
     { 
     n--; 

     if(*s1 == *s2) 
     { 
      if(_memcmp(s1, s2, length) == 0) 
      { 
      return_val = (uint8*) s1; 
      } 
     } 

     s1++; 
     } 
    } 
    } 

    return (uint8*)return_val; 
}