2010-10-19 21 views
2

J'ai cette affectation pour implémenter la fonction strcmp. Parfois ça marche bien mais d'autres fois ça plante. Aidez-moi, s'il vous plaît.Le programme C++ se bloque

#include <iostream> 

using namespace std;  

int mystrcmp(const char *s1, const char *s2); 

int main() 
{ 
cout<<mystrcmp("A","A")<<endl;  
cout<<mystrcmp("B","A")<<endl;  
cout<<mystrcmp("A","B")<<endl;  
cout<<mystrcmp("AB","A")<<endl; 

return 0;  
} 

int mystrcmp(const char *s1, const char *s2) 
{ 
while (*s1==*s2) 
{ 
    s1++; 
    s2++; 
} 

if(*s1=='\0') 
    return(0); 

return(*s1-*s2); 
} 
+0

C'est la question? Il inclut la vérification de fin de chaîne, donc il ne devrait pas planter. // Si le code a été corrigé en éditant, que la question n'a pas si cela n'a pas été marqué par un commentaire. – harper

Répondre

10

Il se bloque si les deux l'entrée sont identiques, parce que votre boucle continue au-delà du caractère de fin nul.

Pour corriger cela, vous devez avoir un chèque de nul caractère intérieur la boucle comme:

while (*s1==*s2) { 

    // if s1 points to nul character, then s2 should also, because of the == 
    // which means we've reached the end of the strings and they are equal 
    // so return 0. 
    if(*s1=='\0') 
    return 0; 

    s1++; 
    s2++; 
} 

return *s1-*s2; 
+0

Merci l'homme !! Cela fonctionne parfaitement maintenant. Je vous dois une bière :) – John

+2

Ici, dans SO vous donnez de la bière en donnant un upvote :) – codaddict

+0

Pour développer le commentaire de codaddict. Pointer un dépassement de la fin de la chaîne (c'est-à-dire dépasser le '0') est légal. Déréférencer n'est pas. La boucle d'origine de John aurait pu être laissée à elle-même et avoir pris en compte les quatre cas de post-boucle possibles. (Ne vous embêtez pas à considérer cela à moins que le if() à chaque fois à travers la boucle est cher pour une raison quelconque.) –

3

Votre mystrcmp fonctionnera joyeusement à l'extrémité de la chaîne, parce que votre test pour la terminaison NUL est en dehors de la boucle. Si les chaînes sont identiques, les deux *s1 et *s2 valent 0 et la boucle continue.

3
while (*s1==*s2) 
{ 
s1++; 
s2++; 
} 

'\ 0' == '\ 0'

1

Vous devez penser à ce qui se passera si vos deux chaînes sont les suivantes:

s1:this is a string\0|abcdef 
s2:this is a string\0|abcdef 
     good memory <-|-> bad memory 

Parce que vous avancez simplement les pointeurs alors que le contenu est égal, vous pouvez finir par lire la mémoire d'une manière qui n'est pas définie.

Une meilleure façon est de baser votre code du pseudo-code suivant:

def strcmp(s1,s2): 
    while character at s1 is not '\0': 
     if character at s1 is not the same as character at s2: 
      exit while loop 
     increment s1 and s2 
    return difference between *s1 and *s2 

Cela arrêtera lorsque vous soit atteint la fin de la première chaîne ou vous trouvez une différence (y compris si vous avons atteint la fin de la deuxième chaîne avant la première).