Vous êtes sur la page 1sur 36

8PRO100

lments de programmation

Les chanes de caractres

Les caractres
En informatique, les caractres sont trs importants puisqu ils sont
utiliss pour la communication personne-machine.
Puisque les ordinateurs ne peuvent manipuler que des squences de
bits. les caractres doivent tre encods en binaire.
Un des codes les plus utiliss est le code ASCII.
Chaque caractre est encod l aide de 8 bits: ce qui donne 256
possibilits.

Code ASCII

Code ASCII tendu

Les constantes de type caractre


En C une constante de type caractre est un nombre entier crit
sous la forme dun caractre entre apostrophes, comme a.
La valeur dune constante de type caractre est gale la valeur du
caractre daprs le jeu de caractre de la machine (ex. ASCII).
Exemples:
a
A
B
0

vaut
vaut
vaut
vaut

97
65
66
48

Les squences dchappement


\a
\b
\f
\n
\r
\t
\v
\\
\?
\
\
\ooo
\xhh

caractre dalerte (sonnerie, bell)


retour en arrire (backspace)
saut de page (formfeed)
fin de ligne (newline)
retour de chariot (carriage return)
tabulation horizontale
tabulation verticale
backslash
point dinterrogation
apostrophe
guillemet
nombre octal
nombre hexadcimale

Les constantes de type chane


Un constante de type chane est une squence de caractres,
ventuellement vide, place entre guillemets.
Exemple:
"Je suis une chaine "
"Bonjour groupe!\n"
Note: Les guillemets ne font pas partie de la chane.
"\"Je suis one chaine\""

Les variables de type caractre


Pour declarer une variable de type char, on procde de la faon
suivante:
char c1;
char c2 = a;

/* c1 est une variable de type caractre */


/* c2 est une variable de type caractre
initialise a */

Les entres et sorties


#include <iostream.h>
main(){
char c;
cin >> c;
cout << c;
}

/* fichier den-tte pour le C++ */

#include <stdio.h>
main(){
char c;
c = getchar();
putchar(c);
}

/* fichier den-tte pour le C */

Les entres et sorties


Le fichier den-tte stdio.h:
Contient la dclaration des fonctions standards dentre et de sortie (en C)
Contient aussi la dfinition de EOF (End of file).
int getchar(void)
Retourne le caractre suivant (converti en un int).
retourne EOF si la fin du fichier est atteinte ou si une erreur
survient.
int putchar(char c)
crit le caractre c.
Retourne le caractre crit ou bien EOF en cas derreur.

Exemple 1: Copier des fichiers


#include <stdio.h>
/* copie lentre sur la sortie, premire version */
main(){
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}

Exemple 1: Copier des fichiers


#include <stdio.h>
/* copie lentre sur la sortie; premire version*/
main(){
int c;
Pourquoi
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}

un int?

Qu'est-ce que EOF?


Supposons que le fichier contienne trois entiers : 32 8 15

Qu'est-ce que EOF?


Supposons que le fichier contienne trois entiers : 32 8 15

Qu'est-ce que EOF?


Supposons que le fichier contienne trois entiers : 32 8 15

Qu'est-ce que EOF?


Supposons que le fichier contienne trois entiers : 32 8 15

Exemple 1: Copier des fichiers


La valeur retourn par getchar() peut tre
un des 256 caractres ASCII
OU
la valeur EOF
La fonction getchar() peut donc retourner 257 valeurs possibles.
Mais un char est un entier de 8 bits et ne peut donc reprsenter que
256 valeurs possibles.
On doit donc utiliser plus de bits (et donc un int) pour faire la
diffrence entre un caractre et EOF.

Exemple 1: Copier des fichiers


Exemple:
Sur SUNENS un int est un entier de 32 bits et EOF
scrit en binaire de la faon suivante:
11111111111111111111111111111111
32 bits
Losrque lon met EOF dans une variable de type char on ne
met que les 8 premiers bits, cest--dire 11111111 = 255
Le caractre dont la valeur est 255 est:

Exemple 1: Copier des fichiers


#include <stdio.h>
/* copie lentre sur la sortie, seconde version */
main(){
int c;
while ((c=getchar()) != EOF)
putchar(c);
}

Exemple 2: Compter les caractres


#include <stdio.h>
/* La fonction nbcar compte les caractres en entre */
int nbcar(){
int nc;
nc = 0;
while (getchar() != EOF)
nc = nc + 1;
return nc;
}

Exemple 3: Compter les lignes


#include <stdio.h>
/* La fonction nblignes compte les lignes en entre */
int nblignes(){
int c, nl;
nl = 0;
while ((c=getchar()) != EOF)
if (c == \n)
/* En fait on compte les nombre de */
nl = nl + 1;
/* changement de lignes */
return nl;
}

Exemple 4: Compter les mots


#include <stdio.h>
#define DEDANS 1
#define DEHORS 0

/* lintrieur dun mot */


/* lextrieur dun mot */

/* La fonction nbmots compte les mots en entre */


int nbmots(){
int c, nm, etat;
nm = 0;
etat = DEHORS;
while ( (c=getchar()) != EOF )
if ( (c == \n) || (c == ) || (c == \t) )
etat = DEHORS;
else if (etat == DEHORS) {
etat = DEDANS;
nm = nm + 1;
}
return nl;
}

ctype.h

Le fichier den-tte ctype.h contient la dclaration de fonctions


destines tester les caractres:
isdigit(char c) retourne 1 si c est un chiffre, 0 sinon
is lower(char c) retourne 1 si c est une lettre minuscule, 0 sinon
isupper(char c) retourne 1 si c est une lettre majuscule, 0 sinon
isalpha(char c) retourne 1 si c est une lettre, o sinon
isspace(char c) retourne 1 si c est un character d'espacement, 0 sinon
et plusieurs autres.

Exemple 5: isdigit(c)
#include <stdio.h>
int isdigit(char c){
return ( (c >= 0) && (c <=9) );
}

Exemple 6: islower(c)

#include <stdio.h>
int islower(char c){
return ( (c >= a) && (c <=z) );
}

Exemple 7: isupper(c)

#include <stdio.h>
int isupper(char c){
return ( (c >= A) && (c <=Z) );
}

Exemple 8: isalpha(c)

#include <stdio.h>
int isalpha(char c){
return ( islower(c) || isupper(c));
}

Remarques

Les exemples 5 8 pourraient ne pas fonctionner correctement sur un


systme utilisant un code autre que ASCII
Dans ctype.h, ces fonctions prennent un int comme paramtre.

Les chanes de caractres


En C il ny a pas de variable de type chane de caractres.
Une chane de caractre est un tableau de caractres se terminant par
le caractre \0 (le caractre nul ayant la valeur 0)
Ainsi la chane Bonjour groupe! serait reprsente de la faon
suivante:

B o

10

11

12

13 14 15

! \0

Exemple 9: Lire une ligne


#include <stdio.h>
/* lireligne: lit une ligne, la met dans s et retourne sa longueur qui doit
tre au plus lim-1 */
int lireligne( char s[], int lim) {
int c, i;
for (i=0; i< lim-1 && (c=getchar())!=EOF && c!= \n; i=i+1)
s[i] = c;
if (c==\n) {
s[i]=c;
i = i + 1;
}
return i;
}

Exemple 10: Copier une chane

#include <stdio.h>
/* copier: copie le tableau de dans le tableau vers ;
on supose que le tableau vers est assez long */
void copie( char de[], char vers[]) {
int i;
i = 0;
while ( (vers[i] = de[i]) != \0)
i = i + 1;
}

Exemple 11: Comparer 2 chanes


#include <stdio.h>
/* compare: Retourne -1, 0, ou 1 selon que chaine1 est
lexicographiquement plus petite, gale ou plus grande
que chaine2.
void compare( char chaine1[], char chaine2[]) {
int i;
i = differe_ou(chaine1, chaine2); /* differe_ou retourne la premire
position o chaine1 et chane2 diffrent. */
if ( chaine1[i] < chaine2[i] )
return -1;
else if ( chaine1[i] > chaine2[i] )
return 1;
else
return 0;
}

Exemple 11: Comparer 2 chanes


#include <stdio.h>
/* differe_ou: Retourne la premire position o chaine1 et chane2
diffrent. Retourne la position du caractre \0 si les
deux chanes sont gales. */
int differe_ou( char chaine1[], char chaine2[]) {
int i;
i = 0;
while ( chaine1[i] != \0 && chaine1[i] = =chaine2[i])
i = i + 1;
return i;
}

Exemple 12: Initialiser une chane


#include <stdio.h>
char mot1[80]="bonjour";
char mot2[80]={'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0'};
for (i=0; mot1[i]; i++) putchar(mot1[i]);
for (i=0; mot2[i]; putchar(mot2[i++]));

string.h
Le fichier den-tte string.h contient des dclarations de fonctions
permettant de manipuler des chanes de caractres.
char* strcpy(char[], char[])
char* strcat (char[], char[])
int strcmpr (char[], char[])
int strlen(char[])
et beaucoup dautres.

copie la premire chaine dans la seconde


concatne les deux chanes
compare deux chanes
retourne la longueur dune chane

Exemple 13: chercher un mot


#include <stdio.h>
char mot1[80]="bonjour";
char mot2[80]={'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0'};
for (i=0; mot1[i]; i++) putchar(mot1[i]);
for (i=0; mot2[i]; putchar(mot2[i++]));