2009-10-07 7 views
1

Nous avons une fonction la plus longue, qui renvoie la plus longue sous-chaîne composée de lettres. Exemple:C - Si/Else et pointeurs renvoyant une mauvaise chaîne

longest("112****hel 5454lllllo454") 

renverrait: lllllo

Cependant, quand je lance le programme, il semble revenir lllllo454. Voici la fonction:

char *longest(char *s){ 
    char *pMax = NULL; 
    int nMax = 0; 
    char *p = NULL; 
    int n = 0; 
    int inside = 0; //flag 
    while(*s!='\0'){ 
     char c = *s; 
     if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){ 
      if(inside == 0){ 
       n = 1; 
       p = s; 
       inside = 1; 
      } 
      else 
       n++; 
      if(inside == 1){ 
       if(n > nMax){ 
        nMax = n; 
        pMax = p; 
        inside = 0; 
       } 
      } 
     }//end isLetter if 
     s++; 
    } 
    return pMax; 
} 

Il y a quelque chose que je ne vois pas ici ... qu'est-ce que vous en pensez?

Répondre

6

Vous venez de renvoyer un pointeur sur le premier caractère de la sous-chaîne la plus longue. Vous n'ajoutez pas réellement de terminateur de chaîne après la fin de la sous-chaîne, donc il continue à la fin de la chaîne d'origine. Vous devez probablement copier la sous-chaîne (uniquement les caractères de la séquence) dans une nouvelle chaîne et renvoyer un pointeur sur cette chaîne.

char* newStr = malloc(nMax+1); 
strncpy(newStr, pMax, nMax); 
*(newStr+nMax) = '\0'; 
return newStr; 
+1

Ou avoir "int * nMax" comme paramètre de sortie. Si c'est le cas, il vaut mieux avoir des vérifications nuls avant d'assigner à * nMax - c'est une convention commune "je n'ai pas besoin de ça". – Steve314

3

Vous calculez nMax mais ne rien faire avec cette information. En C, un char* indique le début d'une chaîne de caractères, terminée par un caractère NUL. Puisque vous ne modifiez pas le tampon passé à votre fonction, le pointeur renvoyé pointe vers le premier 'l' et continue jusqu'à la fin de la chaîne d'origine.

0

Ce retourne le plus grand sous-chaîne qui commence par une chaîne. La partie de la fonction qui définit inside, comme suit:

if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){

ne sera exécutée que si c est une lettre. Puisque vous voulez le plus grand sous-chaîne qui comprend une lettre, avez-vous besoin d'être:

if(c != ' '){

Puis, à l'intérieur de cette boucle, ont une autre variable, dire containsLetter, c'est vrai que si vous rencontrez une lettre avant un autre espace.