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 Chapitre 4 : Fichiers de type texte Page 83
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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 :
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);
Chapitre 4 : Fichiers de type texte Page 84
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 :
Écrire un programme permettant de saisir une chaîne de caractères tapés au clavier, d'afficher la chaîne, de vérifier et d'afficher si la chaîne est un palindrôme (même lecture dans deux sens : exemple "Laval").
int palindrome ( char chaine[] ) { int i , j , n = strlen(chaine);
strupr(chaine); /* convertir en MAJUSCULE */
for ( i = 0, j = n - 1 ; i < j ; i++, j-- ) if ( chaine[i] != chaine[j] ) return 0 ;
return 1 ; }
void main () { char * ch ;
ch = (char *) malloc(90) ; /* allouer la mémoire */ printf("Tapez une chaîne de caractères "); gets(ch);
Chapitre 4 : Fichiers de type texte Page 99
printf("La chaine %s %s\n", ch, palindrome(ch) ? " est un palindrôme" : " n'est pas un palindrôme " );
}
Exercice 1 :
Soient les instructions suivantes : char * ch = "Bonsoir" , * P = ch ; int N = 0 ; Quel est le rôle de N dans le bloc d'instructions suivantes ? :
while (*P) if ( strchr("AEIOUY", toupper(*P++)) ) N++ ;
Chapitre 4 : Fichiers de type texte Page 100
Exemple 3 :
Écrire un programme qui permet de saisir le nom d'un verbe régulier du premier groupe (ex. chanter, aimer, ...). Le programme conjugue le verbe au présent de l'indicatif.
void obtenir( char * verbe ) /* verbe régulier (pas manger ==> nous mangeons à la place de nous mangeons), premier groupe (se termine par er (comme aimer) */ { char * P ;
do { printf("Entrez le nom d'un verbe régulier du 1er groupe "): gets(verbe);
P = strstr(verbe, "er") ; if (!P) printf("%s n'est pas du premier groupe\n", verbe); } while (!P); }
void conjuger(char * verbe) { char * base ; int i, k ;
k = strlen(verbe); base = (char *) malloc(k-2); for ( i = 0 ; i < k-2 ; i++ ) base[i] = verbe[i]; base[k-2] = '\0';
printf("\n\nPrésent de l'indicatif du verbe %s\n", verbe);