在字符串中查找字符串

时间:2011-05-17 13:57:03

标签: c pointers

我尝试编写在某些字符串中搜索字符串的函数。 〔实施例: “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;
}

程序中的问题到底是什么(逻辑上)?

3 个答案:

答案 0 :(得分:2)

正确答案显然是使用strtstr。但是,如果您仍然想知道为什么您的代码不起作用,那是因为您正在递增strlen str2。您应该首先在函数的开头计算它,然后在比较chararcters时将temp与它进行比较。

答案 1 :(得分:1)

是的,你应该使用strstr()。但要解释为什么你的功能不起作用:

  • 您的函数总是返回0,因为只有一个返回语句总是到达。
  • 如果str小于str2,则会出现段错误,因为你在内循环中转发了两个指针。
  • 永远不会达到条件temp == strlen(str2),因为temp增量和str2的长度递减

答案 2 :(得分: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;  
}