Vous êtes sur la page 1sur 17

Les chanes de caractres

Dans un programme informatique, les chanes de caractres servent stocker les informations non numriques comme par exemple une liste de nom de personne ou des adresses.

Il n'existe pas de type spcial chane ou string en C. Une chane de caractres est traite comme un tableau une dimension de caractres (vecteur de caractres). Il existe quand mme des notations particulires et une bonne quantit de fonctions spciales pour le traitement de tableaux de caractres.

Dclaration dune chane


Une chane de caractres est un tableau de type char. La dclaration est identique un tableau normal: char <nom_chaine> [<dimension>] La reprsentation interne d'une chane de caractres est termine par le symbole '\0' (NULL). Ainsi, pour un texte de n caractres, nous devons prvoir n+1 octets. Malheureusement, le compilateur C ne contrle pas si nous avons rserv un octet pour le symbole de fin de chane; l'erreur se fera seulement remarquer lors de l'excution du programme ...

Initialiser une chane de caractres


En gnral, les tableaux sont initialiss par l'indication de la liste des lments du tableau entre accolades: char MACHAINE[ ] = {'H','e','l','l','o','\0'}; Pour le cas spcial des tableaux de caractres, nous pouvons utiliser une initialisation plus confortable en indiquant simplement une chane de caractres constante: char MACHAINE[ ] = "Hello"; Lors de l'initialisation par [ ], l'ordinateur rserve automatiquement le nombre d'octets ncessaires pour la chane, c.--d.: le nombre de caractres + 1 (ici: 6 octets). Nous pouvons aussi indiquer explicitement le nombre d'octets rserver, si celui-ci est suprieur ou gal la longueur de la chane d'initialisation.

Exemples dinitialisation
char MACHAINE[ ] = Hello; char MACHAINE[6] = Hello; char MACHAINE[ ] = {H,e,l,l,o,\0}; char MACHAINE[8] = Hello; par contre: char MACHAINE[5] = Hello; donnera une erreur lexcution char MACHAINE[4] = Hello; donnera une erreur la compilation.

Chanes constantes et caractres


Attention la dclaration: Pour la mmorisation de la chane de caractres "Hello", C a besoin de six (!!) octets. 'x est un caractre constant, qui a une valeur numrique: Par exemple: 'x' la valeur 120 dans le code ASCII. "x est un tableau de caractres qui contient deux caractres: la lettre 'x' et le caractre NUL: '\0' 'x est cod dans un octet "x est cod dans deux octets

A savoir (1)
* Les chanes de caractres constantes (string literals) sont indiques entre guillemets. La chane de caractres vide est alors: "" * Dans les chanes de caractres, nous pouvons utiliser toutes les squences d'chappement dfinies comme caractres constants: "Ce \ntexte \nsera rparti sur 3 lignes." * Le symbole " peut tre reprsent l'intrieur d'une chane par la squence d'chappement \. * Le symbole ' peut tre reprsent l'intrieur d'une liste de caractres par la squence d'chappement \' : {'L','\'','a','s','t','u','c','e','\0'}

A savoir (2)
* Plusieurs chanes de caractres constantes qui sont spares par des signes d'espacement (espaces, tabulateurs ou interlignes) dans le texte du programme seront runies en une seule chane constante lors de la compilation: "un " "deux" " trois sera valu "un deux trois" => il est possible de dfinir de trs longues chanes de caractres constantes en utilisant plusieurs lignes dans le texte du programme.

Accder une chane et ses lments


Une chane de caractres est une variable comme une autre pour un programme: on y accde en lappelant par son nom de variable. Une chane est un tableau de caractres: pour accder a ses lments on suit la logique dun tableau. Exemple: char A[6] = Hello; -> A[0] contient H, A[1] contient e A[5] contient \0.

Prcdence et oprations
Une chane de caractres est une variable : on peut utiliser des oprations logiques et mathmatiques. La prcdence des caractres dans l'alphabet d'une machine est dpendante du code de caractres utilis. Pour le code ASCII, nous pouvons constater l'ordre suivant: . . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . . . Les symboles spciaux (' ,+ ,- ,/ ,{ ,] , ...) et les lettres accentues ( , , , , ...) se trouvent rpartis autour des trois grands groupes de caractres (chiffres, majuscules, minuscules). Leur prcdence ne correspond aucune rgle d'ordre spcifique.

Prcdence et oprations
Prcdence alphabtique des caractres induit une relation de prcdence 'est infrieur ' sur l'ensemble des caractres. (idem pour les autres relations logiques) Ainsi, on peut dire que '0' est infrieur 'Z' et noter '0' < 'Z Ceci est possible car dans l'alphabet de la machine, le code du caractre '0' (ASCII: 48) est infrieur au code du caractre 'Z' (ASCII: 90). Exemples "ABC" prcde "BCD car 'A'<'B' "ABC" prcde "B car 'A'<'B' "Abc" prcde "abc car 'A'<'a' "ab" prcde "abcd car "" prcde "cd" " ab" prcde "ab car ' '<'a'

Tests logiques
En tenant compte de l'ordre alphabtique des caractres, on peut contrler le type du caractre (chiffre, majuscule, minuscule). 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: if (C>='A' && C<='Z') C = C-'A'+'a'; ou vice-versa: if (C>='a' && C<='z') C = C-'a'+'A';

Tableaux de chanes
Une chane de caractres est un tableau 1 dimension de caractres. On peut galement dfinir des tableaux plusieurs dimensions qui peuvent contenir des mots: char JOUR[7][9] = {lundi , mardi , mercredi , jeudi , vendredi,samedi,dimanche}; et on peut accder ces mots en utilisant la syntaxe suivante: int I=2; printf(Aujourdhui nous sommes %s,JOUR[I]); qui affichera Aujourdhui nous sommes mercredi. pour accder une lettre dans un mot: JOUR[I][j] avec %c pour laffichage.

Fonctions de bibliothque
Des fonctions de traitement des chanes de caractres sont disponibles dans les bibliothques standards:

<stdio.h> : scanf, printf en utilisant %s dans le format attention: scanf prend une adresse en argument (&x), une chane de caractres tant un tableau (ie, ladresse du premier lment), il ny a pas de &. puts: puts(MACHAINE); est quivalent printf("%s\n",TXT); gets: gets(MACHAINE); lit une ligne jusquau retour chariot et remplace le \n par \0 dans laffectation de la chane.

Fonctions de bibliothque
<string>: strlen(<s>) fournit la longueur de la chane sans compter le '\0' final strcpy(<s>, <t>) copie <t> vers <s> strcat(<s>, <t>) ajoute <t> la fin de <s> strcmp(<s>, <t>) compare <s> et <t> lexicographiquement et fournit un rsultat: ngatif si <s> prcde <t> zro si <s> est gal <t> positif si <s> suit <t> strncpy(<s>, <t>, <n>) copie au plus <n> caractres de <t> vers <s> strncat(<s>, <t>, <n>) ajoute au plus <n> caractres de <t> la fin de <s>

Attention:
La nature de tableau dune chane de caractres (ie, ladresse en mmoire du premier lment) interdit des affections du type A= hello en dehors de la phase dinitialisation. char A[ ]=Hello; char A[6]; A= Hello; est correct mais ne lest pas.

Il faut bien copier la chane caractre par caractre ou utiliser la fonction strcpy respectivement strncpy: strcpy(A, "Hello");

Fonctions de bibliothque
<stdlib>: conversion chane -> nombre atoi(<s>) retourne la valeur numrique reprsente par <s> comme int atol(<s>) retourne la valeur numrique reprsente par <s> comme long atof(<s>) retourne la valeur numrique reprsente par <s> comme double (!) Rgles gnrales pour la conversion: * Les espaces au dbut d'une chane sont ignors * Il n'y a pas de contrle du domaine de la cible * La conversion s'arrte au premier caractre non convertible * Pour une chane non convertible, les fonctions retournent zro

Exercices:
Ex 15: calcul de la surface sous une courbe En utilisant une mthode de type Monte-Carlo (cf calcul de Pi), crivez un programme C qui permet de calculer la surface sous une courbe y=f(x) entre les points x1 et x2. x1 et x2 seront entrs par lutilisateur avec un scanf. On considerera que la fonction f(x) est une fonction connue dcrite par la dclaration suivante: float f(float x); Ex 16 : tri direct dun tableau crire un programme qui permet de trier un tableau de nombres rels de faon directe et qui affiche le rsultat.