2010-08-12 5 views
3

J'accepte une chaîne comme argument de ligne de commande. Je veux vérifier si la chaîne entrée est un palindrome ou non et imprimer le résultat. J'ai écrit le code suivant. Mais il affiche le résultat «pas palindrome» pour toutes les entrées.Vérification de la chaîne palindrome dans c

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

int main(int argc, char argv[20]) { 
    int i; 
    int l = strlen(argv);  
    char str[20]; 
    bzero(str, 20); 

    for(i=0; i<l; i++) 
    { 
     str[i] = argv[i+2]; 
    } 
    int flag; 
    int len = strlen(str); 
    for(i=0; i< len/2; i++) 
    { 
     if(str[i] == str[len - (i+2)]) 
     { 
      flag = 0; 
     } 
     else 
     { 
      flag = 1; 
      break; 
     } 
    } 

    if(flag == 0) 
     printf("Palindrome\n"); 
    else 
     printf("Not a palindrome\n"); 
} 
+0

Je ne peux pas formater le code ici. Quelqu'un peut-il m'aider s'il vous plaît avec cela aussi avec le problème de programmation? Comment imprimer chaque ligne de code sur une ligne différente? – Khushboo

+0

Pour formater votre code, indentez-le avec quatre espaces ou utilisez le bouton 101010. Ce n'est pas lisible comme ça maintenant. – Thomas

+0

@ user417316, collez votre code dans la zone de texte à partir de l'éditeur que vous utilisez, sélectionnez-le, puis choisissez le bouton de formatage du code (il ressemble aux petits 1 et 0). –

Répondre

1

D'une part, votre signature pour main est désactivé. Il devrait être int main(int argc, char** argv) ou int main(int argc, char * argv[]). Vous traitez un pointeur sur une chaîne comme s'il s'agissait d'une chaîne.

Lorsque vous avez changé cela, la chaîne que vous voulez doit être en argv[1] (puisque argv[0] est une représentation du nom du programme).

+0

En fait, j'ai essayé avec int main (int argc, char ** argv). Mais ça me donne une erreur de casting. J'essaie de comprendre ça aussi. – Khushboo

+1

@user: Alors vous devez comprendre cette erreur, car la signature de main est * mandatée * par la norme. – dmckee

+0

Je l'ai fait avec argv [1] seulement. Mais il montre encore quelques erreurs et avertissements. – Khushboo

0

La première boucle n'a pas de sens. Copier la chaîne dans une autre n'a pas de sens.

Il suffit de le faire et ajuster l'indice:

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

int main(int argc, char **argv) { 
int i; 
char * str = argv[1]; 
int flag; 

int len = strlen(str); 

for(i=0; i< (len+1)/2; i++) 
{ 

    printf("DEBUG: Comparing %c %c\n",str[i], str[len - (i+1)]); 


    if(str[i] == str[len - (i+1)]) 
    { 
     flag = 0; 
    } 
    else 
    { 
     flag = 1; 
     break; 
    } 
} 

    if(flag == 0) 
    printf("Palindrome\n"); 
else 
    printf("Not a palindrome\n"); 
} 
5

Vous pouvez le faire dans un K & R style en ayant deux décalage itérateurs dans un for -loop:

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

int main(int argc, char *argv[]) { 
    assert(argc != 1); 

    char *text = argv[1]; 

    int len = strlen(text); 
    int is_palindrome = 1; 
    int i, j; 

    for(i = 0, j = len - 1; i < len/2; i++, j--) { 
     if(text[i] != text[j]) { 
      is_palindrome = 0; 
      break; 
     } 
    } 

    printf("%s a palindrome.\n", is_palindrome ? "is" : "isn't"); 

    return(0); 
} 

Changements de original:

  • Changement de quart (len >> 1) en division (len/2) comme dixfour suggéré.
+0

En fait, je ne suis pas très à l'aise de programmation avec l'utilisation de pointeurs. J'ai besoin d'acquérir plus d'informations et de compréhension des pointeurs. Peut-être alors je vais essayer de programmer avec l'utilisation de pointeurs. Y a-t-il un autre moyen de résoudre le problème du palindrome? – Khushboo

+0

optimisation: 'int len ​​= strlen (texte)/2;' – tenfour

+0

Je voudrais recommander les vidéos amusantes de pointeur de Binky: http://cslibrary.stanford.edu/104/ – gamen

1

Il y a un bon cas pour l'utilisation de pointeurs plutôt que des index pour cela:

int is_palindrome(const char *s) { 
    const char *end = s + strlen(s); 
    while (end > s) { 
     --end; 
     if (*end != *s) return 0; 
     ++s; 
    } 
    return 1; 
} 

Si vous aimez court, le code source de confusion, vous pouvez ré-écrire que:

int is_palindrome(const char *s) { 
    const char *end = s + strlen(s); 
    while (end > s) if (*(--end) != *(s++)) return 0; 
    return 1; 
} 

argv ISN C'est une chaîne, c'est un tableau de chaînes, une pour le nom du programme et une pour chaque argument (généralement séparé par une ligne de commande). Donc, pour tester si le premier argument est un palindrome, vous êtes intéressé par argv [1].

int main(int argc, char **argv) { 
    if (argc != 2) { 
     printf("usage: %s <string>\n", argv[0]); // or something 
     return 1; 
    } 
    if (is_palindrome(argv[1])) { 
     printf("Palindrome\n"); 
    } else { 
     printf("Not a Palindrome\n"); 
    } 
} 
2

jour à base de commentaires:

int is_palindrome(const char *s) 
{ 
    const char *t = s + strlen(s); 
    while (s<t && *s==*--t) s++; 
    return s>=t; 
} 

Et puisque l'OP veut une version qui est pas si lourd sur les pointeurs:

int is_palindrome(const char *s) 
{ 
    size_t i=0, j = strlen(s); 
    while (i<j && s[i]==s[--j]) i++; 
    return i>=j; 
} 

Pour référence, voici la version buggy originale:

int is_palindrome(const char *s) 
{ 
    const char *t = s + strlen(s) - 1; 
    while (s<t && *s++==*t--); 
    return s>=t; 
} 
+2

Je ne pense pas donner "cryptique" C aide à apprendre. – strager

+1

Je n'appelle pas cela énigmatique. Je l'appelle ne pas faire un repas de choses. Lorsque vous avez une tâche insignifiante à accomplir, ne la compliquez pas en écrivant autant ... à moins d'essayer de vous relâcher et de convaincre votre patron que vous avez écrit un tas de «lignes de code». –

+1

Malheureusement, il échoue pour beaucoup de non-palindromes comme "ab". Essayez 'while (* s == * t && s ++ schot

0

Aucun pointeur s (sauf celui utilisé pour faire une copie de la chaîne d'origine).

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

int main(int argc, char *argv[]) 
{ 
    char *s2; 

    if (argc != 2) 
     return (1); // not properly invoked 

    if ((s2 = strdup(argv[1])) == NULL) 
     return (2); // failed (not likely) 

    printf("\"%s\" %s a palindrome.\n", argv[1], strcmp(argv[1], strrev(s2)) ? "is not" : "is"); 

    free(s2); 

    return (0); 
} 
Questions connexes