Chaine de caractere

yo -  
paly2 Messages postés 254 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
jai ce programme à réviser pour mon rattrapage mais je comprend pas tres bien ,s'il vous plait est ce que ya qlqun qui pourra m'expliquer chaque étape du programme

Ecrire une fonction qui détermine si oui ou non une chaîne de caractères reçue en paramètre,
est un palindrome. Un palindrome est un mot qui peut se lire dans les deux sens.

Correction:
#include <stdio.h>
#include <string.h>
int is_palindrome(char *s)
{
int i,j;
i=0;
j=strlen(s)-1;
while(i<j && s[i++]==s[j--]);
return i<j? 0 : 1;
}



et aussi je ne comprend pas l'etape de: j=strlen(s)-1 , je vois pas pourquoi il fait ca
A voir également:

2 réponses

jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
On maintient deux indices i et j , l'un croissant et l'autre décroissant.
Comme en C les indices des tableaux commencent à 0, i est initialisé à 0, j pointant au départ vers le dernier caractère non nul de la chaine, d'où le strlen(s) - 1

s : a b c d e f g 0x0
i=0 strlen(s)-1
0
yo
 
merci bcp
0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
Bonjour,

On parcourt donc la chaine en commençant par 'i' indiquant le 1er et 'j' indiquant le dernier caractère.
La boucle while fait plein de choses.
  • on boucle tant que i<j pour comparer 1er/dernier, 2nd/avant-dernier, etc. quand on arrive au milieu on aura 'i' aura monté jusqu'à atteindre 'j' qui descend.
  • la boucle ne se fera que si on a aussi s[i]==s[j] car on ne continue que si les caractères symétriques sont égaux.
  • les i++ et j-- sont aussi effectués (après les 2 tests).

Pour finir si 'i' a rejoint 'j' c'est que tous les caractères testées étaient égaux 2 à 2, il s'agit d'un palindrome, la fonction retourne 1, sinon ce sera 0.
cela s'écrit return i<j ? 0 : 1;

Une version 'moins compacte' et totalement identique à ce code.
int is_palindrome( char const *s ) {
    int i = 0;             // position du 1er caractere
    int j = strlen(s) - 1; // position dernier caractere
    while ( i<j  &&  s[i]==s[j] ) { // tant que pas atteint le milieu et que le caracteres symetriques sont egaux
        ++i;               // passer au caractere suivant
        --j;               // passer au caractere precedent
    }
    if ( i < j )           // milieu n'a pa ete atteint avec tous les symetriques egaux
        return 0;          // ce n'est pas un palindrome
    else
        return 1;          // c'est donc un palindrome
}
0
yo
 
merci beaucoup votre programme est plus facile a comprendre mais juste un détail ,pourquoi vous mettez s comme pointeur et ca signifie quoi const???:int is_palindrome( char const *s )
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
pourquoi vous mettez s comme pointeur
C'est toi qui as mis un pointeur dans ton post initial.

Le const signifie que la valeur pointée est non modifiable. Par ailleurs, ici on aurait même pu mettre : char const *const s; (le second const aurait signifié que le pointeur est non modifiable).
0
paly2 Messages postés 254 Date d'inscription   Statut Membre Dernière intervention   25
 
Pourquoi utilise-t-on une pointeur ? Question importante.

palindrome est une chaîne de caractères.
Une chaîne de caractères est un tableau de char.

Le prototype de la fonction peut donc tout à fait être
int is_palindrome(char s[])
.

Le C dispose d'une fonctionnalité selon laquelle les tableaux et les pointeurs peuvent être convertis entre eux. Le compilateur voit que la fonction prend un pointeur comme paramètre, et que toi tu veux lui passer un tableau, il prend donc l'adresse de la première case du tableau pour la passer à la fonction (conversion tableau vers pointeur). Ensuite, dans la fonction, le compilateur voit que tu utilises l'opérateur [] sur le pointeur s. Comme cet opérateur n'est applicable que sur un tableau, le compilateur convertit le pointeur en tableau avant d'effectuer l'opération (tu aurais très bien pu écrire
*(s + i++)
à la place de
s[i++]
, dans quel cas il n'y aurait eu aucune conversion et s serait resté en tant que pointeur, mais ne le fais pas, c'est moins clair).
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Pas mal de confusion entre pointeur et tableau...

Une chaîne de caractères n'est pas forcément un tableau de char. Ca peut être un pointeur.

Le C dispose d'une fonctionnalité selon laquelle les tableaux et les pointeurs peuvent être convertis entre eux.
Que dans un sens. Tableau converti en pointeur. Et ce n'est pas une fonctionnalité, c'est tout simplement que ce n'est pas possible de passer de tableau en paramètre en C. D'ailleurs à quelques exceptions prêtes, le tableau est transformé en pointeur.

Ensuite, dans la fonction, le compilateur voit que tu utilises l'opérateur [] sur le pointeur s. Comme cet opérateur n'est applicable que sur un tableau, le compilateur convertit le pointeur en tableau
Non. s reste un pointeur... C'est juste que *(s+i)=s[i] et donc on a l'impression que ça redevient un tableau...
0
paly2 Messages postés 254 Date d'inscription   Statut Membre Dernière intervention   25
 
Au temps pour moi je viens de vérifier dans l'ISO/IEC 9899:TC2, et il n'est précisé nulle part que les pointeurs sont convertis en tableaux, selement les tableaux en pointeur.
Il est aussi écrit que l'opérateur [] s'applique sur les tableaux ET sur les pointeurs.

Je m'excuse de mon erreur :p
0