2017-10-14 3 views
0

J'écris un programme pour vérifier les palindromes. J'ai récemment pris C et je me demandais s'il y avait une raison pour laquelle mon interprétation ne fonctionnerait pas? Cela a-t-il quelque chose à voir avec mon utilisation de la copie directe d'argv dans un tableau charCopier argv et le vérifier pour un palindrome

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

int main(int argc,char *argv[]){ 
    int i; 
    int a; 
    int size; 


    for(a = 1; a < argc; a++){ 
     char *reverseThis = argv[a]; 
     char *normal = argv[a]; 
     size = strlen(reverseThis); 
     for(i = 0; i < size; i++){ 
      reverseThis[i] = normal[size - i - 1]; 
     } 
     for(i = 0; i < size; i++){ 
     reverseThis[i] = tolower(reverseThis[i]); 
     normal[i] = tolower(normal[i]); 
     } 
     if(strcmp(reverseThis,normal)==0){ 
      printf("\"%s\": on palindromi\n",argv[i]); 
     } 
     else 
      printf("\"%s\": ei ole palindromi\n",argv[i]); 
    } 
    return 0; 
} 
+2

Ni 'char * argv reverseThis = [a],' ', ni char * = normal argv [a];' copie, vous pointez les deux pointeurs à la même chaîne/'tableau char' - la copie est faite via la fonction ['strcpy'] (http://en.cppreference.com/w/c/string/byte/strcpy) – UnholySheep

Répondre

0

Vous utilisez une approche incorrecte.

Pour commencer cette boucle

for(i = 0; i < size; i++){ 
    reverseThis[i] = normal[size - i - 1]; 
} 

copie la moitié droite de la chaîne dans l'ordre inverse dans la moitié gauche de la chaîne tout à fait sa partie gauche écrasant.

Par exemple, si vous avez une chaîne comme celui-ci "123456" puis après la boucle il ressemblera "654456"

Cette comparaison ne fait également pas de sens

if(strcmp(reverseThis,normal)==0){ 

parce que les pointeurs pointent tous deux à la même chaîne . Donc, la condition donne toujours vrai.

prendre en compte que ces déclarations

char *reverseThis = argv[a]; 
char *normal = argv[a]; 

ne copient pas la chaîne originale pointée par argv[a]. Les pointeurs déclarés pointent simplement sur le premier caractère de la même chaîne.

Et voici une faute de frappe

printf("\"%s\": on palindromi\n",argv[i]); 
            ^^^ 

La tâche peut être effectuée plus simple sans changer les chaînes.

Par exemple

size_t n = strlen(argv[a]); 
size_t i = 0; 

while (i < n/2 && tolower((unsigned char)argv[i]) == tolower((unsigned char)argv[n -i - 1])) ++i; 

if (i == n/2) 
{ 
    printf("\"%s\": on palindromi\n", argv[a]); 
} 
else 
{ 
    printf("\"%s\": ei ole palindromi\n",argv[a]); 
} 

Si vous avez besoin en effet de copier les chaînes alors soit déclarer des tableaux de longueur variable (si le compilateur les prend en charge) ou allouer des tableaux dynamiquement. Par exemple (la déclaration de tableaux de longueur variable):

size = strlen(argv[a]); 
char reverseThis[size + 1]; 
char normal[size + 1]; 

strcpy(reverseThis, argv[a]); 
strcpy(normal, argv[a]); 
-3

Le premier « si » prendre de argv dans l'indice « i », i == au dernier changement qui a changé dans le dernier « pour », dans votre cas i == 4, et le programme s'est écrasé parce que leur chaîne n'est pas dans ce membre, pour corriger cela, vous devriez changer le "i" à 0 avant le "si".

0

Dans votre code, vous ne copiez pas les chaînes, vous avez attribué à la fois normal et reverseThis à même chaîne argv[a] .En reverseThis vous devez copier argv[a] après l'allocation de mémoire. votre code suffit de modifier en boucle for:

for(a = 1; a < argc; a++){ 

    char *normal = argv[a]; 
    size = strlen(normal); 
    char *reverseThis = (char*)malloc((size+1)*sizeof(char)); 
    int j=0; 
    for(i = size-1; i >= 0; i++){ 
     reverseThis[j++] = normal[i]; 
    } 
    reverseThis[j]='\0'; 
    . 
    . 
0

Vous n'avez pas besoin d'inverser la chaîne et comparer pour savoir si la chaîne d'entrée est palindrome ou non.

Vous pouvez simplement comparer les caractères de la chaîne à partir des deux extrémités de la chaîne et déplacer un caractère vers l'avant à partir du début de la chaîne et un caractère vers l'arrière à partir de la fin de la chaîne. Si tous les caractères correspondent jusqu'à ce que vous atteigniez le milieu de la chaîne, alors la chaîne est palindrome sinon pas un palindrome.

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
int main(int argc,char *argv[]){ 
    int i, a, size; 

    for(a = 1; a < argc; a++){ 
     char *ptr= argv[a]; 
     int notpalindrom = 0; 

     size = strlen(ptr) - 1; 
     for(i = 0; i < size;){ 
      if (tolower(ptr[i++]) != tolower(ptr[size--])){ 
       notpalindrom = 1; 
       break; 
      } 
     } 
     if (notpalindrom) 
      printf ("%s is not palindrom\n", ptr); 
     else 
      printf ("%s is palindrom\n", ptr); 
    } 
    return 0; 
}