执行strstr()函数

时间:2010-08-24 13:54:45

标签: c

代码在许多地方说“无效的间接”。请帮助。

   int main()
    {

        char *s1,*s2,*position;
        printf("Enter string:\n");
        gets(s1);
        printf("Enter word to find:\n");
        gets(s2);
        *position=ststr(*s1,*s1);
        if(*position)
        printf("word is found at %c loc\n",*position);
        else
        printf("word not found");
        getch();
        return 0;

    }

char *strstr(char *s1,char *s2)
{
    int flag=1;
    char i,j;
    for(i=0; ;i++)
    {
        if(*s1[i]==*s2[0])
        for(j=i;*s2;j++)
        {
            if(*s1[j]!=*s2[j])
            flag=0;
        }

    }
    if(flag)
    return i;
    else
    return 0;
}

6 个答案:

答案 0 :(得分:5)

首先,main中的s1s2尚未初始化为指向任何有意义的位置。将它们声明为静态数组,或使用malloc()calloc()在运行时为它们分配内存:

#define SIZE 20 // or some number big enough to hold your input
...
char s1[SIZE], s2[SIZE], *position; // s1 and s2 declared statically

其次,永远不会永远不会使用gets(); 在您的程序中引入故障点。请改用fgets()

if (fgets(s1, sizeof s1, stdin) != NULL)
  // process s1
else
  // check for EOF or error on read

修改

和其他人一样,你在strstr()函数中的比较需要

*s1 == *s2

s1[i] == s2[i]

但首先你需要处理在main中正确分配你的缓冲区。

答案 1 :(得分:2)

if(*s1[i]==*s2[0])

是我的gcc抱怨的一个例子:

error: invalid type argument of ‘unary *’ (have ‘int’)

如果s1是指向char的指针,则s1[i]是一个字符。因此,您不能再dereference(使用*),即s1[i]不再指向任何内容。

尝试

if(s1[i]==s2[0])

代替。


您还应该更改strstr的返回值:返回一个整数,您声明返回指向字符的指针。因此,请尝试返回s1+i


这里:

for(j=i;*s2;j++)

可能不是你想要的。你没有在循环中的任何地方推进指针s2,实际上你只是测试每次迭代s2[0](与*s2相同)是否为零。如果s2不是空字符串,则此循环将永远不会终止。

答案 2 :(得分:1)

         if(*s1[j]!=*s2[j]) 
  • *s1表示“s1指向的字符”。
  • s1[j]表示“*(s1+j)”或“s1指向后的字符j位置”

你必须使用其中一个;不是两个。

答案 3 :(得分:1)

我注意到的一个问题是,只要你做*s1[j]。星号取消引用数组,[]表示法也是如此。

s[i]实际上意味着*(s + i),因此您无需再次取消引用它。你拥有它的方式会读**(s + i),因为它是一个指针,你不能这样做。

答案 4 :(得分:1)

#include <stdio.h>

char* my_strstr(char *s2, char *s1)
{
  int i, j;
  int flag = 0;

  if ((s2 == NULL || s1 == NULL)) return NULL;

  for( i = 0; s2[i] != '\0'; i++)
  {
    if (s2[i] == s1[0])
    {
      for (j = i; ; j++)
      {
        if (s1[j-i] == '\0'){ flag = 1; break;}
        if (s2[j] == s1[j-i]) continue;
        else break;
      }
    }
    if (flag == 1) break;
  }

  if (flag) return (s2+i);
  else return NULL;
}

int main()
{
  char s2[] = "This is the statement";
  char s1[] = "the";
  char *temp;

  temp = my_strstr(s2,s1);

  printf("%s\n",temp);
  return 0;
}

答案 5 :(得分:0)

#include "stdio.h"
char *strstr(char *str, char *substr)
{
    int len = strlen(substr);
    char *ref = substr;
    while(*str && *ref)
    {
        if (*str++ == *ref)
        {
            ref++;
        }
        if(!*ref)
        {
            return (str - len);
        }
        if (len == (ref - substr))
        {
            ref = substr;
        }
    }
    return NULL;
}

int main(int argc, char *argv[])
{
  printf("%s \n", strstr("TEST IS NOT DONE", "IS NOT"));
}