Programme C phrase palindrome

Fermé
Daniel - Modifié par Daniel le 16/02/2012 à 18:25
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 18 févr. 2012 à 01:12
Bonjour,
voilà un programme C qui affiche si une phrase est palindrome ou pas
bon le problème c'est que pour " esope reste et se repose " mon programme affiche non palindrome et je ne trouves pas la faute ? merci d'avance

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int palindrome (char * ph ,int deb,int fin )
{

if (ph == '\0' || (deb > fin))
return 1;

if (ph(deb) == ' ') deb++;
if (ph(fin) == ' ') fin--;

if (ph[deb] != ph[fin])
return 0;
else
deb ++;printf ("%d\n" , deb);
fin --;

if (ph(deb) == ' ') deb++;
if (ph(fin) == ' ') fin--;

return (palindrome (ph , deb,fin));
}

int main ()
{
char* ch ;
ch = malloc (10 * sizeof (char)) ;
printf ("donner une chaine ch\n") ;
scanf("%s" ,ch );
if (palindrome (ch,0,strlen(ch)-1) == 1)
printf ("la chaine saisie est palindrome\n ") ;
else
printf ("la chaine est non palindrome \n");
return 0;
}

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
Modifié par fiddy le 18/02/2012 à 01:11
Bonjour,
Il y a deux raisons pour que ça ne marche pas.
La première est que tu utilises scanf("%s", ch), la chaîne s'arrêtera donc au premier espace. Ainsi, ch vaudra "esope" qui n'est évidemment pas un palindrome.
Il faut donc corriger en utilisant fgets, ou sinon scanf("%[^\n]", ch)

ch = malloc (10 * sizeof (char)) ;
"esope reste ..." est une chaîne qui fait plus que 9 caractères, donc cela va causer des problèmes.
En plus, tu as oublié le free. Bref, autant mettre une allocation statique comme : char ch[256]; et hop tu ne te poses pas de question. A condition d'utiliser scanf("%255[^\n]", ch);

Ensuite, quelques remarques sur le code :
if (ph[deb] != ph[fin])
return 0;
else
Autant ne pas mettre le else. Ou alors utilise des accolades car sinon seule l'instruction suivante fait partie du else. Algorithmiquement, ça fera la même chose, mais ce n'est pas propre.

je te laisse le soin de corriger tes erreurs et si ça ne marche pas, reposte ton code en utilisant la balise "code" (à droite du bouton souligné).

Et pour info, la célèbre phrase est : "esope reste ici et se repose" ;-)))
Cdlt,

Google is your friend
1
malaik5 Messages postés 258 Date d'inscription vendredi 20 novembre 2009 Statut Membre Dernière intervention 28 novembre 2013 33
17 févr. 2012 à 15:42
Bonjour,
Je n'ai pas bien regarder de ton par manque de temps, mais à premiere vue, je pense que c'est les espaces qui te foutent la merde, je m'explique :

à un moment donné tu va comparer le 'r' avec espace et bien évidement ce n'est pas le meme caractere, et du coup tu as en sortie '0' et du coup ta fonction main te dit que ta phrase et non palindrome ce qui est totalement logique.
e = e
s = s
o = o
p = p
e = e
= r --> faux.

Essayes autre chose et tiens moi au courant.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
Modifié par fiddy le 18/02/2012 à 01:13
Ce ne sont pas les espaces puisqu'il a bien mis :
if (ph(deb) == ' ') deb++;  
if (ph(fin) == ' ') fin--;  

En revanche, un while aurait été mieux pour éviter les problèmes en cas de multiples espaces.
0