2017-01-14 3 views
0

Salut J'ai appris en classe à propos de la bibliothèque string.h et plus particulièrement de la fonction strcmp qui compare les chaînes aux chaînes. et si la première chaîne apparaît en premier dans le dictionnaire, elle retournera un nombre supérieur à 0, si la deuxième chaîne est plus grande que la première, elle retournera un nombre inférieur à 0 et si elle est égale à 0. ive utilisé comme ceci:strcmp renvoyant seulement 0 (bug de palindrom algo)

strcmp(strArr , strrev(strArr)); 

ne hésitez pas à me renseigner.

Le code:

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

#define MAX_LENGTH 100 
#define PALINDROM_TRUE 0//because in strcmp if both strings compared are equile the strcmp will return 0. 
int main(void) 
{ 
    char strArr[MAX_LENGTH]; 
    printf("Enter string (max length 100 chars): "); 
    fgets(strArr , MAX_LENGTH , stdin); 
    int pali = strcmp(strArr , strrev(strArr)); 
    if(pali == PALINDROM_TRUE) 
    { 
     printf("Palindrom\n"); 
    } 
    else 
    { 
     printf("Not Palindrom\n"); 
    } 
    system("PAUSE"); 
    return 0; 
} 

mon problème est que le code ci-dessous quand je rentre à-dire « abc » il imprime à l'écran Palindrom qui devrait imprimer Non Palindrom, il imprime jamais Non Palindrom

+0

Avez-vous essayé d'imprimer les valeurs de '' strArr' et strrev (strArr) 'pour vous assurer qu'ils ont les valeurs que vous attendez? –

+0

damn ive a réussi à faire pali un 'int', désolé pour cela. – spyc

+0

Votre "* fix *" pour le fonctionnement de 'strcmp()' est une source potentielle de confusion. Au lieu de cela, essayez quelque chose comme '#define strequal (x, y) (strcmp ((x), (y)) == 0)' et ensuite 'if (strequal (x, y) == true)' ... –

Répondre

6

La raison en est votre appel à strrev(). La fonction strrev() fonctionne sur place. En d'autres termes, strrev fonctionne sur le même tampon (c'est-à-dire le tableau strArr) que le tableau original, et n'alloue pas un nouvel espace pour la chaîne inversée. Par conséquent, une fois que vous appelez strrev() avec strArr, la chaîne dans strArr est inversée, et tout ce que vous faites compare les deux chaînes identiques: celle de strArr, et celle de strArr, qui sont toutes les deux maintenant renversé. (Notez que les deux termes peuvent être erronés.En fait, il n'y a qu'un seul tampon et les deux arguments de strcmp pointent vers celui-ci.)

Une façon de résoudre ce problème est d'allouer un second tableau strArr2 et de copier la chaîne dans ça. Ensuite, inversez la chaîne dans strArr2 et appelez strcmp avec strArr et strArr2. Voici comment cette solution devrait ressembler au code.

... 
    char strArr2[MAX_LENGTH]; 
    ... 
    strcpy(strArr2, strArr); 
    strrev(strArr2); 
    int pali = strcmp(strArr , strArr2); 
    if(pali == PALINDROM_TRUE) 
    { 
     printf("Palindrom\n"); 
    } 
    else 
    { 
     printf("Not Palindrom\n"); 
    } 
    ... 

Notez que vous pouvez également vérifier la fin de strArr pour tous les caractères d'espace de fuite, en raison de votre méthode spécifique de la prise d'entrée. Un tel caractère d'espacement final pourrait rendre votre inversion et comparer la stratégie inutile en affectant le résultat de la comparaison.

Si vous n'avez pas beaucoup d'espace, ou si MAX_SPACE est une valeur trop grande, une autre façon serait d'utiliser une fonction de comparaison personnalisée pour vérifier si une chaîne est palindrome sans avoir à utiliser strcmp ou strrev.

+0

Me battre de 10 secondes. Mangez un upvote! – DeiDei

+0

@ilim ne fonctionne toujours pas, maintenant il imprime seulement _Non Palindrom_. Ive a essayé d'imprimer les deux chaînes et l'imprime avec 3 lignes d'espacement entre elles même si je n'utilise pas du tout. – spyc

+0

@ilim de toute façon pour que ce code fonctionne quand un utilisateur entre dans un espace ?? – spyc

2
int pali = strcmp(strArr , strrev(strArr)); 

Cette ligne est évidemment le problème.

L'appel à strrev(strArr) inverse strArr donc plus tard, quand strcmp est appelé, attendez-vous strArr être différent? Mais c'est la même variable ...

Vous devez créer un autre tableau char pour stocker la chaîne inversée.

EDIT:

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

#define MAX_LENGTH 100 

int main(void) 
{ 
    char str[MAX_LENGTH]; 
    char rev[MAX_LENGTH]; 

    puts("Enter string (max length 100 chars): "); 
    scanf("%s", str); 

    strcpy(rev, str); 
    strrev(rev); 

    if(strcmp(str, rev) == 0) { 
     puts("Palindrom"); 
    } else { 
     puts("Not Palindrom"); 
    } 
} 
+0

comme ça? \t 'strcpy (strArrRev, strArr); strrev (strArrRev); int pali = strcmp (strArr, strArrRev);' – spyc

+0

@spyc Cela semble bien à première vue, oui. – DeiDei

+0

lorsqu'il est compilé avec le changement, il n'apparaît jamais comme un palindrom, et quand j'imprime les deux, ils apparaissent avec trois lignes d'espace entre et comme abc cba. mais quand je fais l'aabbaa, il apparaît aabbaa et il écrit encore que ce n'est pas un pali. – spyc

-1

ive ajouté

strArr[strcspn(strArr, "\n")] = 0; 

après

fgets(strArr , MAX_LENGTH , stdin); 

Et ça a marché, sa réécriture basiquement le (null) à la fin. qui déconnecte l'inverse pour inclure null (0) au début de la chaîne. Merci à tous.

code finsihed:

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

#define MAX_LENGTH 100 
#define PALINDROM_TRUE 0//because in strcmp if both strings compared are equile the strcmp will return 0. 
int main(void) 
{ 
    char strArr[MAX_LENGTH], strArrRev[MAX_LENGTH]; 
    printf("Enter string (max length 100 chars): "); 
    fgets(strArr , MAX_LENGTH , stdin); 
    strArr[strcspn(strArr, "\n")] = 0; 
    strcpy(strArrRev, strArr); 
    int pali = strcmp(strArr , strrev(strArrRev)); 
    if(pali == PALINDROM_TRUE) 
    { 
     printf("Palindrom\n"); 
    } 
    else 
    { 
     printf("Not Palindrom\n"); 
    } 
    system("PAUSE"); 
    return 0; 
}