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
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
A voir également:
- Chaine de caractere
- Caractère ascii - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
- Plus de chaine tv - Guide
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
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
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
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
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.
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 }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
12 juin 2016 à 01:15
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).
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).
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
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
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).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
17 juin 2016 à 02:20
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...
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...
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
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
Il est aussi écrit que l'opérateur [] s'applique sur les tableaux ET sur les pointeurs.
Je m'excuse de mon erreur :p
12 juin 2016 à 00:09