2010-08-24 133 views
0

该代码说在很多地方“无效的间接”。请帮助。执行strstr()函数

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; 
} 
+10

哦,我的上帝,这是全明星! – 2010-08-24 14:00:48

+0

你有任何其他的方式:P? – 2010-08-24 14:48:15

回答

5

首先,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 

其次,NEVER NEVER永远永远永远使用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] 

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

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

是我的GCC抱怨这样一个例子:

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

如果s1是一个指向chars1[i]是炭。所以你不能再dereference它(与*),即s1[i]不再指向任何东西。

尝试

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

代替。


你也应该改变的strstr返回值:你在哪里申报返回一个指向一个字符返回一个整数。所以请尝试返回s1+i


此位置:

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

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

+0

我知道了第二部分,我想我是对的。 – 2010-08-24 15:23:50

+1

我发现我在回复中遗漏了一个字,我会更新它。我的gcc抱怨strstr中的return语句:warning:return使得整型指针没有转换。的确,你应该返回一个指向char(s1 + i或者等价于(s1 [i]))的指针,而不是一个整数(比如i)。 – 2010-08-25 07:42:53

1
  if(*s1[j]!=*s2[j]) 
  • *s1是指 “其中S1指向的字符”。
  • s1[j]意味着“*(s1+j)”或

你必须使用一个或另一个“其中S1指向之后的字符Ĵ位置”;不是都。

1

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

s[i]真的意味着*(s + i),所以你不必重新引用它。你有它的方式将读取**(s + i),因为它是一个单一的指针,你不能这样做。

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; 
} 
+0

你能评论你的答案,所以其他人更好地理解为什么这个代码是回答这个问题? – Sergio 2013-06-25 06:36:57

+0

内部循环中的'flag'变量和'continue'和'break'内容是不必要的。内循环的主体可以是'{if(s1 [j-i] =='\ 0')return(s2 + i); if(s2 [j]!= s1 [j-i])break; ''或其附近。 – 2013-07-09 15:38:33

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")); 
} 
+2

通常在SO中,仅仅提供一段代码而不提供一些解释就不是好习惯。请提供一些关于您的回复的信息,以便其他人更容易理解。 – afxentios 2017-01-12 17:52:04