Chaine de caractere
yo
-
paly2 Messages postés 254 Date d'inscription Statut Membre Dernière intervention -
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:
et aussi je ne comprend pas l'etape de: j=strlen(s)-1 , je vois pas pourquoi il fait ca
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:
- Chaine de caractere
- Caractère ascii - Guide
- Caractère spéciaux - Guide
- Caractere speciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
- Caractere vide - Guide
2 réponses
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
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
yo
merci bcp
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.
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.
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 }
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
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
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).
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...
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...