Chapitre 4 : Fichiers de type texte Page 83
Chapitre 4 : Chaînes de caractères
En C, on peut présenter une chaîne de caractères sous forme de :
1. tableau des caractères : char nom [20] ;
ou de 2. pointeur vers le type caractère : char * telephone ;
1) Schéma de représentation d'une chaîne de caractères :
Si la valeur d'une chaîne de caractères nommée urgent vaut "911"
par exemple, on la présente avec le schéma suivant :
| '9' | '1' | '1' |'\0'|
urgent -----> |_____|_____|_____|____|
La chaîne se termine par le caractère invisible '\0' qui marque sa fin.
2) Déclaration, initialisation et affectation :
Écrire d'autres manières différentes pour déclarer la chaîne
urgent et donner la valeur "911" à cette chaîne.
Solution :
1. Sous forme tableau des caractères :
a. Manière 1 :
char urgent[4] ; /* pour le caractère '\0' aussi */
strcpy(urgent, "911"); /* string copy : copie une chaîne à
une autre chaîne (string.h) */
Il est intéressant de noter que l'affectation suivante
est invalide :
urgent = "911" ;
urgent est le nom d'un tableau, il n'est pas une "lvalue"
(left value : valeur à gauche une affectation).
Chapitre 4 : Fichiers de type texte Page 84
b. Manière 2 : déclarer et "initialiser"
char urgent[4] = "911" ;
c. Manière 3 : déclarer et "initialiser"
char urgent[4] = { '9', '1', '1', '\0' } ;
d. Manière 4 : déclarer et "affecter"
char urgent[4] ;
urgent[0] = '9' ;
urgent[1] = '1' ;
urgent[2] = '1' ;
urgent[3] = '\0';
e. Manière 5 : déclarer et lire sa valeur
char urgent[4] ;
printf("Quel est le numéro pour l'urgence ? ");
scanf("%s", urgent); /* ou gets(urgent) ; avec <string.h> */
Notez que la lecture avec scanf n'est pas assez pratique :
char nomPre [20] ;
printf("Entrez le nom et prénom ");
scanf("%s", nomPre);
printf("Le nom et prénom lu : %s\n", nomPre);
Si le nom et prénom tapé est Cloutier Gilles
la valeur de nomPre est "Cloutier" seulement! : l'espace
entre Cloutier et Gilles provoque la fin de la saisie. On
perd une partie des informations.
Chapitre 4 : Fichiers de type texte Page 85
2. Sous forme pointeur vers le type char
char * urgent ;
On peut faire des choses semblables comme avec un tableau
des caractères :
char * urgent = "911" ; OU
char * urgent ;
......
strcpy(urgent , "911"); OU
char * urgent ;
......
gets(urgent);
De plus, on peut affecter (qui n'est pas le cas d'un tableau) :
urgent = "911" ; /* correct ici! */
Cependant, il est préférable d'allouer la mémoire avant de faire
l'affectation et surtout de la lecture :
urgent = (char *) malloc (4) ; /* avec <stdlib.h> */
urgent = "911" ;
3) Affichage du contenu d'une chaîne de caractères :
Soit char * urgent = "911" ; OU char urgent[4] = "911" ;
Longueur d'une chaîne (strlen : string length) :
strlen("911") vaut 3 (ne pas tenir compte de '\0')
strlen(urgent) vaut 3
Affichage d'une chaîne (code de format %s) :
L'instruction :
printf("Numéro pour l'urgence : %s\n", urgent);
fait afficher :
Numéro pour l'urgence : 911
Chapitre 4 : Fichiers de type texte Page 86
Mise en garde :
L'instruction :
printf("Numéro pour l'urgence : %c\n", *urgent);
fait afficher seulement :
Numéro pour l'urgence : 9
Pourquoi ?
urgent est un pointeur vers le type char :
| '9' | '1' | '1' |'\0'|
urgent -------> |_____|_____|_____|____|
*urgent
*urgent est de type char, *urgent vaut '9' ici.
4) La concaténation des chaînes de caractères :
char * ch1 , * ch2 ;
ch1 = (char *) malloc(80);
ch1 = "Bonjour ";
ch2 = "tout le monde!";
Après l'instruction :
strcat(ch1, ch2) ;
ch1 vaut "Bonjour tout le monde!".
Après l'instruction :
strncat(ch1, ch2, 3) ;
ch1 vaut "Bonjour tou".
5) La copie des chaînes de caractères :
a) char * strcpy(char * destination, char * source)
Exemple :
...
strcpy(nomPre,"LALIBERTE PIERRE");
printf("%s", nomPre);
Chapitre 4 : Fichiers de type texte Page 87
Le bloc affiche : LALIBERTE PIERRE
b) char * strncpy (char * destination,char * source, int k)
(on copie jusqu'à k caractères au maximum)
Exemple :
...
strncpy(nomPre,"LALIBERTE PIERRE",4);
printf("%s", nomPre);
Le bloc affiche : LALI
6) La comparaison des chaînes de caractères :
a) int strcmp(char * chaine1, char * chaine2)
valeur retournée par la fonction signification
< 0 chaine1 < chaine2
0 chaine1 = chaine2
> 0 chaine1 > chaine2
Exemple :
...
strcmp("Bon", "Bourse") est inférieur à 0 car 'n' < 'u'
(les 2ères lettres sont pareilles)
strcmp("Bon", "Bon") vaut 0
strcmp("papa", "GRAND") est supérieur à zéro car 'p' > 'G'
(code ASCII)
b) int strncmp(char * chaine1,char * chaine2, int k)
Comme strcmp en se limitant aux k premiers caractères.
Exemple :
...
strncmp("Bon", "Bourse", 2) est 0
strncmp("Bon", "Bourse", 3) est < 0
etc ...
c) int stricmp (char * chaine1, char * chaine2)
int strincmp(char * chaine1, char * chaine2, int k)
Elles fonctionnent comme les deux dernières fonctions sans
tenir compte de la différence entre les majuscules et les
minuscules.
1 / 16 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !