2011-05-17 203 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; 
}