École Supérieure de Technologie
et d’Informatique
A.U. 2011/2012
Cours programmation en langage C
Chapitre : chaines de caractères (15 pages)
LA inf – LA SIL – LA ARS 1ère année
(cid:1) Une chaîne de caractères est traitée comme un tableau à une dimension de caractères
(vecteur de caractères).
(cid:1) Il existe des notations particulières et une bonne quantité de fonctions spéciales pour le
traitement de tableaux de caractères.
Déclaration et mémorisation
Exemples
char nom [20];
char prenom [20];
char phrase [300];
Espace à réserver
(cid:1) Lors de la déclaration, il faut indiquer l'espace à réserver en mémoire pour le stockage de la
chaîne.
(cid:1) La représentation interne d'une chaîne de caractères est terminée par le symbole '\0' (NUL).
Ainsi, pour un texte de n caractères, il faut prévoir n+1 octets.
mémorisation
(cid:1) Le nom d'une chaîne est l'adresse du premier caractère de la chaîne.
Char nom[20]= «bonjour » ;
nom
‘o’
‘b’
F800
0 1 2 3 4 5 6 7 19
‘o’
F801 F802 F803 F804 F805 F806 F807 ….
‘\0’
‘u’
‘n’
….
‘r’
‘j’
Le ‘\0’ à l’indice 7 est rajouté automatiquement.
nom : représente la valeur F800.
printf(« %p », nom) ; => F800
printf(« %s », nom) ; => bonjour
printf(« %s », nom+2) ; => njour
printf(« %s », nom+3) ; => jour
printf(« %c », nom[0]) ; => b
utilisation du format %s pour afficher une chaine de caractère
(cid:1) Les chaînes de caractères constantes
(cid:1) Les chaînes de caractères constantes sont indiquées entre guillemets. La chaîne de
caractères vide est alors: ""
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 1
(cid:1) Dans les chaînes de caractères, nous pouvons utiliser toutes les séquences d'échappement
définies comme caractères constants:
"Ce \n texte \n sera réparti sur 3 lignes."
(cid:1) Le symbole " peut être représenté à l'intérieur d'une chaîne par la séquence d'échappement
\" :
"Affichage de \"guillemets\" \n "
(cid:1) Le symbole ' peut être représenté à l'intérieur d'une liste de caractères par la séquence
d'échappement \' : {'L','\'','a','s','t','u','c','e','\0'}
Remarque
Pour la mémorisation de la chaîne de caractères "Hello", C a besoin de six (!!) octets (1 caractère
occupe un octet).
'x' est un caractère constant, qui a une valeur numérique:
'x' a la valeur 120 dans le code ASCII.
"x" est un tableau de caractères qui contient deux caractères: la lettre 'x' et le caractère NUL: '\0'
'x' est codé dans un octet
"x" est codé dans deux octets
Initialisation de chaînes de caractères
(cid:1) En général, les tableaux sont initialisés par l'indication de la liste des éléments du tableau
entre accolades:
char CHAINE[] = {'H','e','l','l','o','\0'};
Pour le cas spécial des tableaux de caractères, il est possible d’utiliser une initialisation plus
confortable en indiquant simplement une chaîne de caractère constante:
char CHAINE[] = "Hello";
(cid:1) Lors de l'initialisation par [], l'ordinateur réserve automatiquement le nombre d'octets
nécessaires pour la chaîne, c.-à-d.: le nombre de caractères + 1 (ici: 6 octets). Il est aussi
possible d’indiquer explicitement le nombre d'octets à réserver, si celui-ci est supérieur ou
égal à la longueur de la chaîne d'initialisation.
Exemple : Dans chacune de ces déclarations, indiquer si la déclaration est correcte ou incorrecte,
ainsi que le nombre d’octets réservés.
(cid:1) char a[] = "un\ndeux\ntrois\n"; // Déclaration correcte Espace: 15 octets
(cid:1) char b[12] = "un deux trois"; // Déclaration incorrecte:
Correction: char b[14] = "un deux trois";
ou bien: char b[] = "un deux trois";
Espace: 14 octets
(cid:1) char c[] = 'abcdefg'; // Déclaration incorrecte: char c[] = "abcdefg";
Espace: 8 octets
(cid:1) char d[10] = 'x'; // Déclaration incorrecte: Correction: char d[10] = {'x', '\0'}
ou bien: char d[10] = "x";
Espace: 2 octets
(cid:1) char e[5] = "cinq";
(cid:1) char g[2] = {'a', '\0'}; // Déclaration correcte
Espace: 2 octets
// Déclaration correcte, Espace: 5 octets
(cid:1) char h[4] = {'a', 'b', 'c'}; //Déclaration incorrecte: Dans une liste de caractères, il faut aussi
indiquer le symbole de fin de chaîne.
Correction: char h[4] = {'a', 'b', 'c', '\0'};
Espace: 4 octets
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 2
(cid:1) char i[4] = "'o'"; // Déclaration correcte, c’est une chaîne contenant les caractères '\'', 'o', '\''
et '\0'. Espace: 4 octets
(cid:1) Pointeurs et chaînes de caractères
(cid:1) De la même façon qu'un pointeur sur int peut contenir l'adresse d'un nombre isolé ou d'une
composante d'un tableau, un pointeur sur char peut pointer sur un caractère isolé ou sur les
éléments d'un tableau de caractères.
(cid:1) Un pointeur sur char peut en plus contenir l'adresse d'une chaîne de caractères constante et
il peut même être initialisé avec une telle adresse.
int *p ;
1er cas :
P pointe sur une variable de type int
int x ;
p
x
char *p ;
1er cas :
P pointe sur une variable de type char
char x ;
p
x
2ème cas
P pointesur une case d’un tableau d’entiers
2ème cas
P pointe sur une case d’un tableau de caractères
p
Int tab[]
p
3ème cas
P pointe sur une chaine de caractères constante
char *p= « ali » ;
p
F800
a
l
Publicité
i
\0
F800 F810 F820 F830
Affectation
On peut attribuer l'adresse d'une chaîne de caractères constante à un pointeur sur char:
Exemple
char *p;
p = « chaine »;
Initialisation
Un pointeur sur char peut être initialisé lors de la déclaration si on lui affecte l'adresse d'une chaîne
de caractères constante:
char *B = "ali";
Remarque
(cid:1) Il existe une différence importante entre les deux déclarations:
(cid:1) char A[5] = « test »; / un tableau /
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 3
(cid:1) char B = « test »; / un pointeur */
(cid:1) A est un tableau qui a exactement la grandeur pour contenir la chaîne de caractères et la
terminaison '\0'. Les caractères de la chaîne peuvent être changés, mais le nom A va toujours
pointer sur la même adresse en mémoire.
(cid:1) B est un pointeur qui est initialisé de façon à ce qu'il pointe sur une chaîne de caractères
constante stockée quelque part en mémoire. Le pointeur peut être modifié et pointer sur
autre chose. La chaîne constante peut être lue, copiée ou affichée, mais pas modifiée.
Modification
(cid:1) Si nous affectons une nouvelle valeur à un pointeur sur une chaîne de caractères constante,
nous risquons de perdre la chaîne constante.
(cid:1) un pointeur sur char a l'avantage de pouvoir pointer sur des chaînes de n'importe quelle
longueur:
(cid:1) Exemple
char *A = "Petite chaîne";
char *B = "Deuxième chaîne un peu plus longue";
A = B;
(cid:1) Maintenant A et B pointent sur la même chaîne; la "Petite chaîne" est perdue:
Remarques
(cid:1) Utilisation des tableaux de caractères pour déclarer les chaînes de caractères à modifier.
(cid:1) Utilisation des pointeurs sur char pour manipuler des chaînes de caractères constantes (dont
le contenu ne change pas).
Tableaux de pointeurs
(cid:1) Si nous avons besoin d'un ensemble de pointeurs du même type, nous pouvons les réunir
dans un tableau de pointeurs.
(cid:1) Int *tab[10]; déclare un tableau de 10 pointeurs sur des entiers.
(cid:1) Le plus souvent, les tableaux de pointeurs sont utilisés pour mémoriser de façon économique
des chaînes de caractères de différentes longueurs
(cid:1) Il est possible d’initialiser les pointeurs d'un tableau sur char par les adresses de chaînes de
caractères constantes.
Exemple
(cid:1) char *JOUR[] = { "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi","dimanche"};
(cid:1) déclare un tableau JOUR[] de 7 pointeurs sur char. Chacun des pointeurs est initialisé avec
l'adresse de l'une des 7 chaînes de caractères.
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 4
F800 F810 F820 F830 F840 F850
JOUR
F800
0
l u n d i \0
1
2
3
4
5
F100
F500
F700
F400
F300
6
F200
m a r d i \0
F100 F110 F120 F130 F140 F150
m e r c r e d i \0
F500 F510 F520 F530 F540 F550 F560 F570 F580
j e u d i \0
F700 F710 F720 F730 F740 F750
v e n d r e d i \0
F400 F410 F420 F430 F440 F450 F460 F470 F480
s a m e d i \0
F300 F310 F320 F330 F340 F350 F360
d i m a n c h e \0
F200 F210 F220 F230 F240 F250 F260 F270 F280
(cid:1) On peut afficher les 7 chaînes de caractères en fournissant les adresses contenues dans le
tableau JOUR à printf (ou puts) :
int I;
for (I=0; I<7; I++)
printf("%s\n", JOUR[I]);
(cid:1) Comme JOUR[I] est un pointeur sur char, on peut afficher les premières lettres des jours de
la semaine en utilisant l'opérateur 'contenu de' (l m m j v s d):
int I;
for (I=0; I<7; I++)
printf("%c\n", *JOUR[I]);
(cid:1) Pour afficher l’adresse du 3ème caractère de chaque jour (F820, F120, F520, F720, F420, F320,
F220)
int I;
for (I=0; i<7; I++)
printf("%p\n", JOUR[I]+2 );
(cid:1) Pour afficher la troisième lettre de chaque jour de la semaine (n r r u n m m):
int I;
for (I=0; i<7; I++)
printf("%c\n",*(JOUR[I]+2));
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 5
(cid:1) Précédence alphabétique et lexicographique
(cid:1) La précédence des caractères dans l'alphabet d'une machine est dépendante du code de
caractères utilisé. Pour le code ASCII, l'ordre est le suivant:
. . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . . .
(cid:1) Les symboles spéciaux (' ,+ ,- ,/ ,{ ,] , ...) et les lettres accentuées (é ,è ,à ,û , ...) se trouvent
répartis autour des trois grands groupes de caractères (chiffres, majuscules, minuscules).
Leur précédence ne correspond à aucune règle d'ordre spécifique.
(cid:1) Relation de précédence
De la précédence alphabétique des caractères, on peut déduire une relation de précédence 'est
inférieur à' sur l'ensemble des caractères. Ainsi, on peut dire que
'0' est inférieur à 'Z'
et noter
'0' < 'Z'
car dans l'alphabet de la machine, le code du caractère '0' (ASCII: 48) est inférieur au code du
caractère 'Z' (ASCII: 90).
(cid:1) Précédence lexicographique des chaînes de caractères
(cid:1) En nous basant sur cette relation de précédence alphabétique des caractères, nous pouvons
définir une précédence lexicographique pour les chaînes de caractères. Cette relation de
précédence suit l'<<ordre du dictionnaire>> et est définie de façon récurrente:
a) La chaîne vide "" précède lexicographiquement toutes les autres chaînes.
b) La chaîne A = "a1a2a ... ap" (p caractères) précède lexicographiquement la chaîne B = "b1b2 ...
bm" (m caractères) si l'une des deux conditions suivantes est remplie:
1) 'a1' < 'b1'
2) 'a1' = 'b1' et
"a2a3 ... ap" précède lexicographiquement "b2b3 ... bm"
(cid:1) exemples
"ABC" précède "BCD" car 'A'<'B'
"ABC" précède "B" car 'A'<'B'
"Abc" précède "abc" car 'A'<'a'
"ab" précède "abcd" car "" précède "cd"
Publicité
" ab" précède "ab" car ' '<'a'
(le code ASCII de ' ' est 32, et le code ASCII de 'a' est 97)
(cid:1) Remarque
Malheureusement, il existe différents codes de caractères (p.ex. ASCII, EBCDIC, ISO) et l'ordre
lexicographique est dépendant de la machine. Même la fonction strcmp qui indique la
précédence lexicographique de deux chaînes de caractères dépend du code de caractères utilisé.
(cid:1) Conversions et tests
En tenant compte de l'ordre alphabétique des caractères, on peut contrôler le type du caractère
(chiffre, majuscule, minuscule).
(cid:1) Exemples
if (C>='0' && C<='9') printf("Chiffre\n", C);
if (C>='A' && C<='Z') printf("Majuscule\n", C);
if (C>='a' && C<='z') printf("Minuscule\n", C);
Il est facile, de convertir des lettres majuscules dans des minuscules:
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 6
(cid:1) if (C>='A' && C<='Z') C = C-'A'+'a';
ou vice-versa: if (C>='a' && C<='z') C = C-'a'+'A';
Travailler avec des chaînes de caractères
(cid:1) Les bibliothèques de fonctions de C contiennent une série de fonctions spéciales pour le
traitement de chaînes de caractères
•
•
•
•
Les fonctions de <stdio.h>
Les fonctions de <stdio.h>
Les fonctions de <string>
Les fonctions de <stdlib>
Les fonctions de <ctype>
(cid:1) fonctions puts et gets, spécialement conçues pour l'écriture et la lecture de chaînes de
caractères.
Affichage de chaînes de caractères
(cid:1) printf avec le spécificateur de format %s permet d'intégrer une chaîne de caractères dans
une phrase.
(cid:1) En plus, le spécificateur %s permet l'indication de la largeur minimale du champ d'affichage.
Dans ce champ, les données sont justifiées à droite. Si on indique une largeur minimale
négative, la chaîne sera justifiée à gauche. Un nombre suivant un point indique la largeur
maximale pour l'affichage.
(cid:1) Exemples
#include<stdio.h>
#include<string.h>
void main()
{
char NOM[] = "hello, world";
printf("%s\n", NOM);
printf("%5s\n", NOM);
printf("%20s\n", NOM);
printf("%-20s\n", NOM);
printf("%.5s\n", NOM);
}
exécution
hello, world
hello, world
hello, world
hello, world
hello
(cid:1) puts est idéale pour écrire une chaîne constante ou le contenu d'une variable dans une ligne
isolée.
Syntaxe:
puts( <Chaîne> )
Effet:
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 7
puts écrit la chaîne de caractères désignée par <Chaîne> sur stdout et provoque un retour à la ligne.
En pratique,
puts(TXT); (cid:2)(cid:2)(cid:2)(cid:2) printf("%s\n",TXT);
Lecture de chaînes de caractères
(cid:1) scanf avec le spécificateur %s permet de lire un mot isolé à l'intérieur d'une suite de données
du même ou d'un autre type.
(cid:1) Effet:
scanf avec le spécificateur %s lit un mot du fichier d'entrée standard stdin et le mémorise à
l'adresse qui est associée à %s.
Exemple
char LIEU[25];
int JOUR, MOIS, ANNEE;
printf("Entrez lieu et date de naissance : \n");
scanf("%s %d %d %d", LIEU, &JOUR, &MOIS, &ANNEE);
(cid:1) Remarques importantes
- La fonction scanf a besoin des adresses de ses arguments:
•
Les noms des variables numériques (int, char, long, float, ...) doivent être marqués par le
symbole '&'
• Comme le nom d'une chaîne de caractères est le représentant de l'adresse du premier
caractère de la chaîne, il ne doit pas être précédé de l'opérateur adresse '&' !
- La fonction scanf avec plusieurs arguments présuppose que l'utilisateur connaisse exactement le
nombre et le type des données à introduire. Ainsi, l'utilisation de scanf pour la lecture de chaînes de
caractères est seulement conseillée si on est forcé de lire un nombre fixé de mots en une fois.
(cid:1) gets est idéal pour lire une ou plusieurs lignes de texte (p.ex. des phrases) terminées par un
retour à la ligne. Syntaxe:
gets( <Chaîne> )
Effet:
gets lit une ligne de caractères de stdin et la copie à l'adresse indiquée par <Chaîne>. Le
retour à la ligne final est remplacé par le symbole de fin de chaîne '\0'.
Exemple
int MAXI = 1000;
char LIGNE[MAXI];
gets(LIGNE);
(cid:1) Ecrire un programme qui lit 5 mots, séparés par des espaces et qui les affiche ensuite dans
une ligne, mais dans l'ordre inverse. Les mots sont mémorisés dans 5 variables M1, ... ,M5.
Exemple
voici une petite phrase
phrase petite une voici
#include <stdio.h>
void main()
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 8
{
char M1[30], M2[30], M3[30], M4[30], M5[30];
printf("Entrez 5 mots, séparés par des espaces :\n");
scanf ("%s %s %s %s %s", M1, M2, M3, M4, M5);
printf("%s %s %s %s %s\n",M5, M4, M3, M2, M1);
}
la fonction sscanf
char ch[20];
int x,y,z;
printf("saisir date de naissance");
gets(ch);
sscanf(ch,"%2d%2d%4d",&x,&y,&z);
printf("les nombre sont:%d , %d , %d", x,y,z);
la fonction sprintf
char ch[20];
int x,y,z;
printf("saisir trois entiers");
scanf("%d%d%d",&x,&y,&z);
sprintf(ch,"%2d%2d%2d",x,y,z);
puts(ch);
Les fonctions de string.h
(cid:1) La bibliothèque <string> fournit une multitude de fonctions pratiques pour le traitement de
chaînes de caractères. Voici une brève description des fonctions les plus fréquemment
utilisées.
(cid:1) int strlen(char *)
Publicité
fournit la longueur de la chaîne sans compter le '\0' final
int l;
char ch [50]="hello";
l=strlen(ch);
printf("la longueur est %d", l); => la longueur est 5
l=strlen(ch+2);
printf("la longueur est %d", l); => la longueur est 3
(cid:1) void strcpy(char ,char )
char ch1[50]="hello“;
char ch2[50]="bonjour";
strcpy(ch1,ch2); // copie ch2 dans ch1
puts(ch1); => bonjour
puts(ch2); => bonjour
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 9
char ch1[50]="hello";
char ch2[50]="bonjour";
strcpy(ch2,ch1); // copie ch1 dans ch2
puts(ch1); => hello
puts(ch2); => hello
printf("%c", ch2[6]); => r
char ch1[50]="hello";
char ch2[50]="bonjour";
strcpy(ch2+3,ch1+2);
puts(ch1); => hello
puts(ch2); => bonllo
(cid:1) void strcat(char , char )
char ch1[50]="hello“;
char ch2[50]="bonjour";
strcat(ch1,ch2); // ajoute ch2 à la fin de ch1
puts(ch1); => hellobonjour
puts(ch2); => bonjour
char ch1[50]="hello";
char ch2[50]="bonjour";
strcat(ch1+2,ch2+3);
puts(ch1); => hellojour
puts(ch2); => bonjour
(cid:1) int strcmp(char s, char t)
compare <s> et <t> lexicographiquement et fournit un résultat:
négatif si <s> précède <t>
zéro si <s> est égal à <t>
positif si <s> suit <t>
char ch1[50]="hello“;
char ch2[50]="hello";
if (strcmp(ch1,ch2)==0) printf("même chaine"); (cid:2) if (!strcmp(ch1,ch2)) printf("même chaine");
(cid:1) void strncpy(char s, char t, int n)
copie au plus <n> caractères de <t> vers <s>
char ch1[50]="hello";
char ch2[50]="bonjour";
strncpy (ch1,ch2,3);
puts(ch1); => bonlo
puts(ch2); => bonjour
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 10
char ch1[50]="hello";
char ch2[50]="bonjour";
strncpy (ch1+4,ch2+3,3);
puts(ch1); => helljou
puts(ch2); => bonjour
(cid:1) void strncat(char s, char t, int n)
ajoute au plus <n> caractères de <t> à la fin de <s>
char ch1[50]="hello";
char ch2[50]="bonjour";
strncat (ch1,ch2,3);
puts(ch1); => hellobon
puts(ch2); => bonjour
(cid:1) Comme le nom d'une chaîne de caractères représente une adresse fixe en mémoire, on ne
peut pas 'affecter' une autre chaîne au nom d'un tableau:
(cid:1) Il faut bien copier la chaîne caractère par caractère ou utiliser la fonction strcpy
respectivement strncpy:
strcpy(A, "Hello");
(cid:1) char strchr(char , char): recherche dans la chaine la première position où apparait le
caractère mentionné et retourne son adresse. NULL s’il n’existe pas.
ch
j
F500 F510 F520 F530 F540 F550 F560 F570 …
\0
n
o
o
b
u
r
char ch[20]="bonjour";
char *q;
q=strchr(ch,'o'); //recherche de la 1ère occurrence de ‘o’ dans bonjour. La fonction strchr retourne l’adresse
de ce caractère. Dans cet exemple, q reçoit la valeur F510
printf("%s",q); => onjour
printf(« %p », q) ; => F510
(cid:1) Strrchr (chaine, caractère): même traitement mais en explorant la chaine à partir de la fin
char ch[20]="bonjour";
char *q;
q=strrchr(ch,'o');
printf("%s",q); => our
printf(« %p », q) ; => F540
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 11
b
\0
F500 F510 F520 F530 F540 F550 F560 F570 F580 F590 F600 F610 F620 F630 F640
o
u
n
b
o
o
u
o
n
r
r
j
j
(cid:1) char strstr(char ch, char *sch)
Recherche dans chaine ch la première occurrence complète de la sous chaine sch.
char ch[20]="bonjourbonjour";
char *q;
q=strstr(ch,"jour");
printf("%s",q); => jourbonjour
printf("%p",q); => F530
(cid:1) Ecrire un programme qui demande l'introduction du nom et du prénom de l'utilisateur et qui
affiche alors la longueur totale du nom sans compter les espaces. Employer la fonction
strlen.
Exemple:
Introduisez votre nom et votre prénom: azert qsdfgh
Votre nom est composé de 11 lettres.
printf("Introduisez votre nom et votre prénom: \n");
scanf("%s %s", NOM, PRENOM);
printf("Votre nom est composé de %d lettres.\n", strlen(NOM) + strlen(PRENOM));
printf("Votre nom est composé de %d lettres.\n", strlen(strcat(NOM,PRENOM)));
(cid:1) Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2, les compare
lexicographiquement et affiche le résultat:
Publicité
char CH1[200], CH2[200];
gets(CH1);
gets(CH2);
RES = strcmp(CH1,CH2);
if (RES<0) printf("%s précède %s\n",CH1 ,CH2);
else if (RES>0) printf("%s précède %s\n",CH2 ,CH1);
else printf("%s est égal à %s\n",CH1, CH2);
(cid:1) Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 et qui copie la première
moitié de CH1 et la première moitié de CH2 dans une troisième chaîne CH3. Afficher le
résultat.
strncpy(CH3, CH1, strlen(CH1)/2);
strncat(CH3, CH2, strlen(CH2)/2);
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 12
Les fonctions de <stdlib>
La bibliothèque <stdlib> contient des déclarations de fonctions pour la conversion de nombres en
chaînes de caractères et vice-versa.
Chaîne --> Nombre :Conversion de chaînes de caractères en nombres
atoi(<s>) retourne la valeur numérique représentée par <s> comme int
atol(<s>) retourne la valeur numérique représentée par <s> comme long
atof(<s>) retourne la valeur numérique représentée par <s> comme double (!)
(cid:1) Les espaces au début d'une chaîne sont ignorés
(cid:1) La conversion s'arrête au premier caractère non convertible
(cid:1) Pour une chaîne non convertible, les fonctions retournent zéro
char ch[50] ="12";
int n;
n=atoi(ch);
printf("%d",n);
void main()
{
char STR[20];
gets(STR);
printf("Entrée = %s \n", STR);
printf("integer = %d \n", atoi(STR));
printf("long = %ld \n", atol(STR));
printf("double = %f \n", atof(STR));
}
Nombre --> Chaîne
(cid:1) itoa (<n_int>, <s>, <b>)
(cid:1) ltoa (<n_long>, <s>, <b>)
(cid:1) ultoa (<n_uns_long>, <s>, <b>)
Chacune de ces trois procédures convertit son premier argument en une chaîne de caractères qui
sera ensuite attribuée à <s>. La conversion se fait dans la base <b>.
<n_int> est un nombre du type int
<n_long> est un nombre du type long
<n_uns_long> est un nombre du type unsigned long
<s> est une chaîne de caractères
longueur maximale de la chaîne: 17 resp. 33 byte
<b> est la base pour la conversion (2 ... 36)
char ch[20];
itoa(9,ch,2);
printf("%s",ch);
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 13
Les fonctions de <ctype>
(cid:1) Les fonctions de <ctype> servent à classifier et à convertir des caractères. Les symboles (é, è,
ä, ü, ß, ç, ...) ne sont pas considérés. Les fonctions de <ctype> sont indépendantes du code de
caractères de la machine et favorisent la portabilité des programmes.
(cid:1) Dans la suite, <c> représente une valeur du type int qui peut être représentée comme
caractère.
(cid:1) Les fonctions de classification suivantes fournissent un résultat du type int différent de zéro,
si la condition respective est remplie, sinon zéro.
La fonction:
retourne une valeur différente de zéro,
isupper(<c>) si <c> est une majuscule ('A'...'Z')
islower(<c>) si <c> est une minuscule ('a'...'z')
isdigit(<c>)
si <c> est un chiffre décimal ('0'...'9')
isalpha(<c>) si islower(<c>) ou isupper(<c>)
isalnum(<c>) si isalpha(<c>) ou isdigit(<c>)
isxdigit(<c>)
si <c> est un chiffre hexadécimal
('0'...'9' ou 'A'...'F' ou 'a'...'f')
isspace(<c>) si <c> est un signe d'espacement
(' ', '\t', '\n', '\r', '\f')
char c='a';
if(islower(c)) printf("miniscule");
int c=65;
if(isupper(c)) printf("%c",c);
Les fonctions de conversion suivantes fournissent une valeur du type int qui peut être représentée
comme caractère; la valeur originale de <c> reste inchangée:
tolower(<c>) retourne <c> converti en minuscule si <c> est une majuscule
toupper(<c>) retourne <c> converti en majuscule si <c> est une minuscule
char c='A';
int n;
n=tolower(c);
printf("%c %d %d %c",c,c,n,n);
Tableaux de chaînes de caractères
Souvent, il est nécessaire de mémoriser une suite de mots ou de phrases dans des variables. Il est
alors pratique de créer un tableau de chaînes de caractères, ce qui allégera les déclarations des
variables et simplifiera l'accès aux différents mots (ou phrases).
Un tableau de chaînes de caractères correspond à un tableau à deux dimensions du type char, où
chaque ligne contient une chaîne de caractères.
Déclaration
La déclaration char JOUR[7][9];
réserve l'espace en mémoire pour 7 mots contenant 9 caractères (dont 8 caractères significatifs).
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 14
Lors de la déclaration il est possible d'initialiser toutes les composantes du tableau par des
chaînes de caractères constantes:
char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};
Les tableaux de chaînes sont mémorisés ligne par ligne. La variable JOUR aura donc besoin de 791
= 63 octets en mémoire.
Accès aux différentes composantes
(cid:1) Il est possible d'accéder aux différentes chaînes de caractères d'un tableau, en indiquant
simplement la ligne correspondante.
(cid:1) Exemple
L'exécution des trois instructions suivantes:
char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};
int I = 2;
printf("Aujourd'hui, c'est %s \n", JOUR[I]);
affichera la phrase:
Aujourd'hui, c'est mercredi
Des expressions comme JOUR[I] représentent l'adresse du premier élément d'une chaîne de
caractères. Il ne faut pas 'modifier' une telle adresse par une affectation directe !
L'attribution d'une chaîne de caractères à une composante d'un tableau de chaînes se fait en
général à l'aide de la fonction strcpy:
Exemple
La commande
strcpy(JOUR[4], "Friday"); changera le contenu de la 5e composante du tableau JOUR de "vendredi"
en "Friday".
Accès aux caractères
Il est possible d'accéder directement aux différents caractères qui composent les mots du tableau.
Exemple
L'instruction
for(I=0; I<7; I++)
printf("%c ", JOUR[I][0]);
va afficher les premières lettres des jours de la semaine:
l m m j v s d
Mme Wiem Yaiche Elleuch Chaines de caractères
Page 15