2017-08-21 9 views
-2

Bonjour J'apprends le C++ et je veux écrire une fonction simple pour comparer deux chaînes de caractères. J'ai trouvé ce qui suit de K & R2 livre c:Strcmpr faille de la fonction

#include <iostream> 
int strcmp(char *s, char *t); 

int main() { 
    char one[] = "Abe\0"; 
    char two[] = "Abee\0"; 
    std::cout << strcmp(one, two) << "\n"; 
    return 0; 
} 

/* strcmp: return < 0 if s < t, 0 if s == t, >0 if s>t */ 
int strcmp(char *s, char *t) { 
    for (; *s == *t; s++, t++) { 
    if (*s == '\0') { 
     return 0; 
    } 
    return *s - *t; 
    } 
} 

Cependant, il ne dit pas à part deux cordes lorsque l'un d'eux est l'autre, plus les caractères supplémentaires après. // comme dans l'exemple ci-dessus

En outre, il met majuscule après minuscule, mais je veux le contraire. J'ai des difficultés à écrire et je me demande si vous pourriez m'aider.

Edit:

char one[] = "abe\0"; 
    char two[] = "Abe\0"; 
    char a = 'a'; 
    char A = 'A'; 
    std::cout << "a" << static_cast<int>(a) << "\n"; 
    std::cout << "A" << static_cast<int>(A) << "\n"; 
    std::cout << strcmp(one, two) << "\n"; 

Cette impression:

a97 
A65 
32 

32 est> 0 -> cela signifie "abe" est avant "Abe".

Cependant 'A' est de 65 ans et 'a' est 97.

+0

Vous pouvez simplement le remplacer 'retour 0' avec' retour * s - * t', ou peut-être en arrière selon la façon dont vous voulez commander une chaîne plus longue par rapport à une plus courte. –

+2

Le problème est que 'return * s - * t' ne devrait pas être dans la boucle. Vous revenez après la première itération. Vous avez probablement copié le code incorrect. – scohe001

+0

étape par le code avec un débogueur, vous verrez ce qui se passe – pm100

Répondre

0

Le code strcmp en K & R est

for (; *s == *t; s++, t++) 
    if (*s == '\0') 
     return 0; 
return *s - *t; 

Il est dentelée correctement aussi. Vous avez vous-même ajouté les accolades dans tous les mauvais endroits.

+0

Je ne l'ai pas copié et j'ai foiré les accolades, mais je n'ai toujours pas de solution à la deuxième partie de ma question: pourquoi les lettres minuscules sont-elles placées avant les majuscules et comment? faites le contraire – KOKO

+0

@KOKO spécifiquement "met les lettres majuscules avant les lettres minuscules!" Vous comprenez mal la valeur de retour –

+0

Il semble que je me suis trompé sur celui-ci Merci, j'irai mon kitkat maintenant . soupir – KOKO

0

Vous ne regarderez plus jamais au-delà du premier caractère!

int strcmp(const char *s, const char *t) { 
    for (; *s == *t; s++, t++) { 
    if (*s == '\0') { 
     return 0; 
    } 
    } 

    return *s - *t; 
} 

Par ailleurs,

char one[] = "Abe\0"; 
char two[] = "Abee\0"; 

devrait simplement être

char one[] = "Abe"; 
char two[] = "Abee"; 

Le compilateur ajoute déjà un NUL.

+0

@PeterJ 'A' est" avant "'a', mais ce strcmp donne 'a' avant 'A' – KOKO

+1

Non,' A' (0x40) est devant a (0x60) – ikegami

0

Voici le strcmp qui change l'ordre des capitaux et des lettres minuscules swapcase paramètre permet d'activer la permutation majuscules et minuscules lors de la comparition

int swapcase(int ch) 
{ 
    if (isalpha(ch)) 
     if (islower(ch)) 
      ch = toupper(ch); 
     else 
      ch = tolower(ch); 
    return ch; 
} 

int strange_srtcmp(const char *cs, const char *ct, int swapcase) 
{ 
    unsigned char c1, c2; 
    int result = 0; 

    while (*cs && *ct) { 
     c1 = *cs++; 
     c2 = *ct++; 
     if (swapcase) 
     { 
      c1 = swapcase(c1); 
      c2 = swapcase(c2); 
     } 
     if (c1 != c2) 
     { 
      result = c1 < c2 ? -1 : 1; 
      break; 
     } 
    } 
    return result; 
}