Cours programmation en langage C - Chaînes de caractères

Page 1 sur 15Lecteur de document UniversityLib

Cours programmation en langage C - Chaînes de caractères

Computer Science · notes

Voir tous les documents en programmation

É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