2011-05-17 4 views
-1

J'essaie d'écrire la fonction recherchant une chaîne dans une chaîne. exmaple: "qwerty" => touche pour rechercher "qasazqertyqwerty" le programme renvoie 1 car qwerty trouvé dans la chaîne.Rechercher une chaîne dans une chaîne

ma fonction de code est:

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

Qu'est-ce que le problème dans le programme (logiquement)?

+1

Et je suppose que ça ne marche pas ... C'est pour ça que tu poses la question? – ALOToverflow

+0

est ce devoir? –

+3

Est-ce les devoirs? Sinon, utilisez plutôt strstr. http://linux.die.net/man/3/strstr – shinkou

Répondre

2

La bonne réponse est évidemment d'utiliser strtstr. Mais si vous vous demandez encore pourquoi votre code ne fonctionne pas, c'est parce que vous appelez strlen sur str2 que vous incrémentez. Vous devez le calculer d'abord au début de la fonction, puis comparer temp avec quand vous avez fini de comparer les chararcters.

1

Oui, vous devez utiliser strstr(). Mais pour expliquer pourquoi votre fonction ne fonctionne pas:

  • Votre fonction retourne toujours 0, simplement parce qu'il n'y a qu'une seule instruction return qui est toujours atteinte.
  • Vous effectuerez une erreur de segmentation si str est plus petit que str2 car vous transférez les deux pointeurs dans la boucle interne.
  • La température de l'état == strlen (str2) ne sera jamais atteint, car incréments de temp et la longueur de str2 décrémente
0

Voici une version de strstr() je l'ai écrit à un moment donné, il devrait être MISRA -C compatible, sauf pour la distribution finale, qui est là pour la compatibilité avec la définition de la norme strstr(). Le préfixe _ a été utilisé pour indiquer qu'il ne s'agit pas de fonctions de bibliothèque de 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; 
} 
Questions connexes