2010-08-24 8 views
0

Le code dit à de nombreux endroits "indirection invalide" .Veuillez aider.mise en œuvre de la fonction 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

oh mon dieu, il est plein d'étoiles! –

+0

Vous avez un autre moyen de le faire: P? –

Répondre

5

Tout d'abord, s1 et s2 n'ont pas été initialisés pour pointer n'importe où significatif. Soit les déclarer sous forme de tableaux statiques ou allouer de la mémoire à leur disposition à l'exécution en utilisant malloc() ou calloc():

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

Deuxièmement, NE JAMAIS JAMAIS JAMAIS JAMAIS JAMAIS utilisergets(); va introduire un point de défaillance dans votre programme.Utilisez fgets() à la place:

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

EDIT

Et comme tout le monde a fait remarquer, votre comparaison dans la fonction strstr() doit être soit

*s1 == *s2 

ou

s1[i] == s2[i] 

mais vous devez d'abord gérer correctement l'allocation de vos buffers.

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

est un tel exemple où mon gcc se plaint:

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

si s1 est un pointeur vers char, s1[i] est char. Donc vous ne pouvez plus le dereference (avec le *), c'est-à-dire s1[i] ne pointe plus à rien.

Essayez

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

à la place.


Vous devez également modifier la valeur de retour de strstr: vous retournez un entier où vous déclarez retourner un pointeur sur un caractère. Essayez donc de renvoyer s1+i à la place.


Ce ici:

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

ne probablement pas ce que vous voulez. Vous n'allez pas avancer le pointeur s2 n'importe où dans la boucle, en fait vous testez simplement si s2[0] (qui est le même que *s2) est zéro pour chaque itération. Si s2 n'est pas la chaîne vide, cette boucle ne se terminera jamais.

+0

Je dint eu la deuxième partie. Je suppose que j'ai bien fait. –

+1

Je vois que j'ai raté un mot dans la réponse, je vais le mettre à jour. Mon gcc se plaint de l'instruction return dans strstr: warning: return rend le pointeur de l'entier sans cast. En effet, vous devriez retourner un pointeur vers un caractère (s1 + i ou équivalent & (s1 [i])), pas un entier (comme i). –

1
  if(*s1[j]!=*s2[j]) 
  • *s1 signifie "le caractère s1 pointe".
  • s1[j] signifie « *(s1+j) » ou « les positions j de caractères après s1 pointe »

Vous devez utiliser l'un ou l'autre; pas les deux.

1

L'un des problèmes que je remarque est lorsque vous faites *s1[j]. L'astérisque déréférencé le tableau, ainsi que la notation [].

s[i] signifie réellement *(s + i), vous n'avez donc plus besoin de le déréférencer. La façon dont vous l'avez lu serait **(s + i), et puisque c'est un seul pointeur, vous ne pouvez pas faire cela.

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

Pouvez-vous s'il vous plaît commenter votre réponse aussi, afin que les autres comprennent mieux pourquoi ce code est la réponse à la question? – Sergio

+0

La variable 'flag' et les éléments' continue' et 'break' dans la boucle interne sont inutiles. Le corps de la boucle interne pourrait être simplement '{if (s1 [j-i] == '\ 0') return (s2 + i); if (s2 [j]! = s1 [j-i]) se casse; } ', ou à peu près. –

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

Normalement dans SO, il n'est pas recommandé de présenter juste un morceau de code sans fournir d'explication. S'il vous plaît fournir quelques informations sur votre réponse afin qu'il sera compris plus facilement par les autres. – afxentios