1
votes

Comment puis-je comparer deux chaînes par plus d'un seul caractère?

Je veux donc comparer deux chaînes par plus d'un seul caractère. Je sais comment comparer deux chaînes caractère par caractère, ou simplement par caractère sur une position sélectionnée mais je ne sais pas comment comparer deux chaînes par plus d'un caractère? Par exemple, je veux comparer deux chaînes par 3 derniers caractères, comment puis-je faire cela?

J'ai essayé ceci:

if( strcmp(str1, str2) ==0){
    printf("equal");
}else{
    printf("not");

mais cela ne fonctionne pas. Je prends deux chaînes de l'utilisateur avec la fonction scanf.

if( strcmp(str1-1, str2-1)==0 && strcmp(str1-2, str2-2) ==0)


2 commentaires

Quel devrait être le résultat si l'une des chaînes ou les deux ont une longueur inférieure à 3 caractères? Par souci de simplicité, il est préférable de définir que les 3 derniers caractères de "yz" ne sont pas "xyz" non égaux. C'est naturel. Mais plus important encore: les 3 derniers caractères de "ab" et "ab" ne sont PAS égaux!


Voulez-vous dire, comment comparer des sous-chaînes de deux chaînes? Dans le titre, vous parlez d'un caractère, puis dans le texte réel, vous demandez environ 3 caractères.


4 Réponses :


4
votes

Vous devez obtenir la longueur des chaînes, soustraire 3 de cela et l'ajouter au début de la chaîne pour obtenir l'index pour commencer la comparaison. Assurez-vous également que vous n'obtenez pas d'index négatif si la longueur de la chaîne est inférieure à 3.

size_t len1 = strlen(str1);
size_t index1 = len1 >= 3 ? len1 - 3 : 0;
size_t len2 = strlen(str2);
size_t index2 = len2 >= 3 ? len2 - 3 : 0;

if (strcmp(str1 + index1, str2 + index2) == 0) {
    printf("equal\n");
} else {
    printf("not equal\n");
}


0 commentaires

1
votes

Il n'y a pas une telle fonction dans la norme, mais vous pouvez lancer la vôtre, quelque chose comme:

#include <stdio.h>
#include <string.h>

int revcmp(const char *a, const char *b, size_t start)
{
    size_t len;

    len = strlen(a);
    if (len < start) {
        return 0;
    }
    a += len - start;
    len = strlen(b);
    if (len < start) {
        return 0;
    }
    b += len - start;
    return !strcmp(a, b);
}

int main(void)
{
    char *a = "abcxyz";
    char *b = "123xyz";

    printf("%d\n", revcmp(a, b, 3));
    return 0;
}


5 commentaires

Vous retournez 0 si l'une des chaînes est plus petite que le nombre de derniers caractères que vous souhaitez comparer. Mais strcmp renvoie 0 si les chaînes sont égales! Vous voudrez peut-être renvoyer un nombre différent de 0, si la longueur de la chaîne est inférieure à start = 3.


De rien. Mais avec l'inversion que vous avez insérée, revcmp se comporte différemment par rapport à strcmp et à son résultat. Cela peut dérouter le client de la fonction. Veuillez également noter que strncmp ne donne pas seulement une information booléenne, mais une valeur qui indique comment les chaînes sont ordonnées lexigraphiquement.


@Mico Je suis d'accord, OP peut choisir un meilleur nom pour la fonction


@SirJoBlack: revcmp ne peut pas modifier les chaînes car des pointeurs "lecture seule" lui sont passés: const char *.


@Mico Ok, Ok! J'ai supprimé mon commentaire ... :)



0
votes

Vous devez d'abord déterminer la longueur de chaîne des deux chaînes. Les longueurs doivent être supérieures au nombre de derniers caractères que vous souhaitez comparer. Avec l'arithmétique du pointeur, vous pouvez vous déplacer vers les positions où vous voulez commencer votre comparaison:

int strlen1 = strlen(str1);
int strlen2 = strlen(str2);
const int LASTCMP = 3;
if (strlen1 >= LASTCMP && strlen2 >= LASTCMP 
   && strcmp(str1+strlen1-LASTCMP , str2+strlen2-LASTCMP ) == 0)
{
    printf("last %d characters are equal", LASTCMP);
}
else
{
    printf("not");
}


0 commentaires

0
votes

Si vous souhaitez comparer uniquement un certain nombre de caractères, vous pouvez utiliser strncmp .

Si vous voulez comparer les 3 derniers caractères , vous devez déterminer l'index du 3ème dernier caractère de chaque chaîne, afin de pouvoir commencer comparer de cela. Pour cela, vous avez besoin de strlen.

Rassembler ci-dessus et comptabiliser les chaînes de moins de 3 caractères:

int pos1 = strlen(str1) - 3;
int pos2 = strlen(str2) - 3;

if (pos1 >= 0 && pos2 >= 0 && strncmp(str1 + pos1, str2 + pos2, 3) == 0) {
   // last 3 chars of the strings match
}


0 commentaires