2010-08-24 136 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