2015-07-14 5 views
-1

J'ai une question à propos de ce code que j'écris pour un exercice. Je dois vérifier si une chaîne est palindrome. Je ne peux pas changer la déclaration de la fonction.La fonction ne renvoie que 1 lorsque toutes les lettres sont identiques (comme "aaaa") mais si je charge la phrase avec un autre palindrome (comme "anna") la fonction me renvoie 0, Je ne peux pas comprendre pourquoi cette appening.Thank!Vérifie si une chaîne est en palindrome C

char* cargar (char*); 
int pali (char*); 

int main() 
{ 
    char*texto=NULL; 
    texto=cargar(texto); 
    int res=pali(texto); 
    if(res==1){printf("\nPalindrome");} 
    else printf("\nNot palindrome"); 

    return 0; 
} 

char* cargar (char*texto) 
{ 
    char letra; 
    int i=0; 
    texto=malloc(sizeof(char)); 
    letra=getche(); 
    *(texto+i)=letra; 
    while(letra!='\r'){ 
     i++; 
     texto=realloc(texto,(i+1)*sizeof(char)); 
     letra=getche(); 
     *(texto+i)=letra;} 
    *(texto+i)='\0';  
    return texto; 
} 

int pali (char* texto) 
{ 
    int i; 
    for(i=0;*(texto+i)!='\0';i++){ 
    }i--; 
    if(i==0||i==1){return 1;} 

    if(*texto==*(texto+i)){ 
     return pali(++texto); 
    } 
    else return 0; 
} 
+1

Quelle est votre question? –

+0

si je mets quelque chose comme anna, la fonction me renvoie 0, mais "anna" est palindrome – Marco

+0

Il existe de nombreuses ressources qui montrent des algorithmes pour ce problème. Voici un pour c - http://www.programmingsimplified.com/c-program-find-palindrome – MrMadsen

Répondre

5

Votre fonction pour déterminer si une chaîne est un palindrome n'est pas bien pensée. Disons que vous avez une chaîne s de longueur l. Les caractères de la chaîne sont disposés comme:

Indices: 0 1 2 3   l-4 l-3 l-2 l-1 
     +----+----+----+----+- ... -+----+----+----+----+ 
     | | | | | ... | | | | | 
     +----+----+----+----+- ... -+----+----+----+----+ 

Si la chaîne est un palindrome,

s[0] = s[l-1] 
s[1] = s[l-2] 

... 

Vous pouvez arrêter de vérifier si l'index de la LHS est supérieur ou égal à l'indice de le RHS.

Pour traduire en code,

int is_palindrome(char const* s) 
{ 
    size_t len = strlen(s); 
    if (len == 0) // An empty string a palindrome 
    { 
     return 1; 
    } 

    size_t i = 0; 
    size_t j = len-1; 
    for (; i < j; ++i, --j) 
    { 
     if (s[i] != s[j]) 
     { 
     // the string is not a palindrome. 
     return 0; 
     } 
    } 

    // If we don't return from inside the for loop, 
    // the string is a palindrome. 
    return 1; 
} 
+0

size_t j = len-1; – this

+0

@ce, je n'ai pas eu votre dérive. –

0

MARCO essayer.

#include <stdio.h> 
#include <stdlib.h> 
#include<string.h> 
char* cargar (char*); 
int pali (char*); 

int main() 
{ 

char*texto=NULL; 

texto=cargar(texto); 

int res=pali(texto); 

if(res==strlen(texto)){printf("\nPalindrome");} 
else printf("\nNot palindrome"); 

    return 0; 
} 


char* cargar (char*texto) 
{ 
char letra; 
int i=0; 
texto=malloc(sizeof(char)); 
letra=getche(); 
*(texto+i)=letra; 
while(letra!='\r') 
{ 
    i++; 
    texto=realloc(texto,(i+1)*sizeof(char)); 
    letra=getche(); 
    *(texto+i)=letra; 
} 
*(texto+i)='\0';  
return texto; 
} 

int pali (char* a) 
{ 
int flag=0,i; 
int len=strlen(a); 
for (i=0;i<len;i++) 
    { 
    if(a[i]==a[len-i-1]) 
     flag=flag+1; 
    } 
    return flag; 
} 
0

Vous pali tests de fonction si le premier caractère de la chaîne est égal au dernier caractère puis s'invoque pour une position du second caractère de la chaîne. Notez cependant qu'il ne modifie pas la fin d'une chaîne, de sorte que l'invocation récursive compare à nouveau le deuxième caractère au dernier. Alors vous comparez le troisième caractère au dernier ... Finaly pali renvoie 1 si tous les caractères sont égaux au dernier, c'est si tous sont égaux.

Essayez ceci:

int pali (char* texto) 
{ 
    char* end; 
    for(end = texto; *end != '\0'; end ++) 
     ; 

    for(--end; texto < end; ++texto, --end) { 
     if(* texto != * end) 
      return 0; 
    } 
    return 1; 
}