Chaine de caractere

Fermé
yo - Modifié par Chris 94 le 11/06/2016 à 13:25
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 17 juin 2016 à 07:40
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 dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
11 juin 2016 à 14:40
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
merci bcp
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
Modifié par Dalfab le 11/06/2016 à 17:04
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
12 juin 2016 à 01:15
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 vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 16/06/2016 à 15:26
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
17 juin 2016 à 02:20
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 vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 17/06/2016 à 07:40
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