Sie sind auf Seite 1von 5

Dfinitions

En C, une chane de caractres est dfinie comme un tableau de


caractres (alphanumrique, signe de ponctuation, caractre de
contrle,) , dont le dernier lment vaut '\0'

CH

Chapitre 6
LES CHANES DE CARACTRES

\0

Cest ce '\0' de fin qui est caractristique des chanes de caractres et


toutes les fonctions permettant den manipuler supposent que ce '\0' de fin
de chane est prsent
Une chane de caractres est un tableau de caractres qui peut tre
manipul par le biais de fonctions prdfinies

86

Dclaration dune chane de caractres

87

Initialisation dune chane de caractres

Dclaration

De mme que les tableaux, les chanes peuvent tre initialises lors de leur
dfinition

char NomChaine [ longueur ] ; /* sous forme de tableau */

Exemples

Exemple
char Nom [20] ; /* La variable Nom est une chane ne pouvant contenir plus de
19 caractres utiles */

char ch1[8] = {'B', 'o', 'n', 'j', 'o', 'u', 'r', '\0'} ;
char ch2[10] = "Bonjour" ; /* initialisation particulire aux chanes de caractres */

Remarque
char ch3[] = "Bonjour" ; /* Correct : ch3 chaine de 8 caractres*/

Pour mmoriser une chane de N caractres, on a besoin de N+1 octets

char ch4[7] = "Bonjour" ; /* Erreur pendant la compilation */


char jours_semaine[7][9] = {"Lundi" , "Mardi" , "Mercredi" , "Jeudi" , "Vendredi" ,
"Samedi" , "Dimanche" }; /* Tableau de chanes : mmorise les jours de la
semaine*/

88

89

Manipulation des chanes de caractres (1/5)

Manipulation des chanes de caractres (2/5)

Les bibliothques de fonctions de C contiennent une srie de fonctions


spciales pour le traitement de chanes de caractres : stdio.h, string.h et
stdlib.h.

Fonctions de la Bibliothque <stdio.h> (lecture de chanes) :


scanf ()

utiliser avec le spcificateur de format %s pour saisir une chane


de caractres
Exemple :
char lieu[25] ;
printf("Entrez le lieu de naissance (nbre caractres <=24): ") ;
scanf("%s", lieu) ; // noter : pas dutilisation de &

gets
gets(char ch[ ])
ou
gets(char *ch)

Contrairement scanf, la fonction gets permet de saisir des


chanes de caractres contenant des espaces et des tabulations
Exemple :
char str[80] ;
printf("Entrez un texte (nbre caractres <=79): ") ;
gets(str) ;
printf("Le texte lu est : %s\n", str) ;

Fonctions de la Bibliothque <stdio.h> (affichage de chanes) :


printf(..)

puts
puts(char ch[ ])
ou
puts(char *ch)

utiliser avec le spcificateur de format %s pour afficher


une chane de caractres
Exemple
char ch[ ] = "Bonjour tout le monde" ;
printf("%s", ch) ; // affichage de Bonjour tout le monde
permet dafficher tous les caractres jusquau zro de fin
de chane. puts revient la ligne en fin de laffichage
Exemple
char ch[8] = "Bonjour";
puts(ch) ; /* est quivalente printf("%s\n", ch) ;
Affiche Bonjour */

90

Exercice 1

91

Exercice 2

Ecrire un programme C qui demande lutilisateur de lui fournir un nombre


entier entre 1 et 7 et qui affiche le nom du jour de la semaine ayant le
numro correspondant. (char jour[7][9] = {"Lundi" ,"Mardi" ,"Mercredi" ,....};)

Ecrire un programme C qui qui supprime les espaces et tabulations d'une


chane de caractres, sans utiliser de tableau intermdiaire.

#include <stdio.h>
main()
{
char jour[7][9] = {"Lundi" , "Mardi" , "Mercredi" , "Jeudi" , "Vendredi" ,
"Samedi" , "Dimanche" };
int i ;
do
{
printf("donner un nombre entier entre 1 et 7 : "); scanf("%d",&i);
}
while ( ( i<=0 ) || ( i>7 ) );
printf("le nom du jour %d de la semaine est %s ", i , jour[i-1]);

#include <stdio.h>
main()
{ char CH[20]; int i,j=0;
printf("Donner la chaine CH :");
gets(CH); //Lecture de CH
for (i = 0; CH[i] != '\0'; i++)
if (CH[i] != ' ' && CH[i] != '\t')
{
CH[j] = CH[i];
j++;
}
CH[j] = '\0';
puts(CH); //Affichage du rsultat
}

}
92

93

Manipulation des chanes de caractres (3/5)

Manipulation des chanes de caractres (4/5)


Fonctions de la Bibliothque <string.h> (traitement de chanes) (suite) :

Fonctions de la Bibliothque <string.h> (traitement de chanes) :


strlen
int strlen(char s [ ])

strcat
strcat(char s1 [ ], char s2 [ ])

Retourne le nombre de caractres prsents dans la


chane s (sans compter \0')
Exemple :
char s[ ] = "Bonjour";
printf ("%d", strlen(s)); //Affiche 7
Ajoute une copie de la chane s2 la fin de la chane
s1. Le caractre final '\0' de s1 est cras par le 1er
caractre de s2
Exemple :
char ch1[30] = "Bonjour" , ch2[30] = " tout le monde" ;
strcat(ch1, ch2) ;
printf("%s", ch1) ; //Affiche : Bonjour tout le monde

strcmp
int strcmp(char s1[ ], char s2 [ ])

Compare lexicographiquement les chanes s1 et s2, et retourne


une valeur :
= 0 si s1 et s2 sont identiques
< 0 si s1 prcde s2
> 0 si s1 suit s2
Exemple
char ch1[ ]="abc" , ch2[ ]="aab" ;
if (strcmp(ch1, ch2)==0) printf("identiques\n") ;
else
if (strcmp(ch1, ch2)>0) printf("%s prcde %s\n", ch2, ch1)
else printf("%s suit %s\n", ch2, ch1) ;
//Cette instruction affichera : aab prcde abc

strcpy

Copie la chane s2 dans s1 y compris le caractre '\0'

strcpy(char s1[ ], char s2 [ ])

Exemple
char s1[20], s2[10];
strcpy(s1, "Bonjour" ); //Copie de "Bonjour" dans s1
strcpy(s2, s1); //Copie le contenu de s1 dans s2
puts(s2); //Affiche le contenu de s2 : Bonjour

94

Exercice

95

Exercice

Ecrire un programme qui range le miroir (mot lenvers) du mot CH1 dans
une chaine CH2

Ecrire un programme C qui trie un tableau de noms selon lordre


alphabtique. Le tableau contiendra au maximum 30 noms et chaque nom
ne dpasse pas 20 caractres. La mthode de tri utilise est le tri par
slection

#include <stdio.h>
#include <string.h>
main()
{
char CH1[20], CH2[20];
int i,l;
printf("Donner la chaine CH1 :"); gets(CH1);
l=strlen(CH1);
for(i=0; i<strlen(CH1);i++)
{
CH2[i]=CH1[--l];
}
CH2[i]='\0';
printf("\n Le miroir de CH1 :%s", CH2);
}

char noms[30][20];
int N; //Nombre de noms lus
int i , j , pos_min ;
//Lire nombre et liste des Noms
//Trier Noms
//Afficher Noms tris
Rappel :
int strcmp(char s1[ ], char s2 [ ])
strcpy(char s1[ ], char s2 [ ])

96

/*--------------- Tri par slection-------------------*/


for (i=0; i<N-1; i++)
{
//Recherche de l'indice du minimum
imin=i;
for (j=i+1; j<N; j++)
if (A[j]<A[imin])
imin=j;
//permuter T[imin] avec T[i]
if (imin!=i)
{ AIDE=A[imin];
A[imin]=A[i];
A[i]=AIDE;}
}

97

Correction
char noms[30][20];
int N, i , j , pos_min ;
//Lire nombre de noms
printf("\n Donner le nombre de noms lire :");
scanf("%d",&N);
//Lire noms
for( i = 0 ; i < N ; i++ )
{ printf("\n Donner le nom %d :",i+1);
scanf("%s",noms[i]);
}
//Trier nom
char ch[20]; //variable chaine intermdiaire pour effectuer lchange
for( i = 0 ; i < N-1 ; i++ )
{ pos_min = i; //le ime noms est le premier candidat
for( j = i+1 ; j < N ; j++ )
if( strcmp( noms[pos_min] , noms[j] ) > 0 )
pos_min=j;
if(pos_min != i )
{ strcpy( ch , noms[pos_min] );
strcpy( noms[pos_min] , noms[i] );
strcpy( noms[i] , ch) ;
}
}
//Afficher Noms tris.

Exercice
Ecrire un programme C permettant de vrifier si une chane CH1 est
incluse dans une chane CH2 sachant que les deux sont saisies au clavier

98

Correction

99

Manipulation des chanes de caractres (5/5)

#include <stdio.h>
#include <string.h>
main()
{ char CH1[20], CH2[20]; int i=0,j=0,trouve=0;
printf("Donner la chaine CH1 :"); gets(CH1);
printf("\nDonner la chaine CH2 :"); gets(CH2);
while(CH2[i]!='\0'&&trouve==0)
{ j=0;
if(CH2[i]!=CH1[j]) i++;
else
while(CH2[i]==CH1[j] && trouve ==0 && CH2[i]!='\0')
{ i++;j++;
if (CH1[j]=='\0') trouve=1;
}
}
if(trouve==1)
{ if (strlen(CH1)==strlen(CH2))printf("\nCH1 est identique a CH2");
else printf("\nCH1 est incluse dans CH2");
}
else
printf("\n CH1 n est pas incluse dans CH2");
}

Fonctions de la Bibliothque <string.h> (traitement de chanes) (suite)


strchr
char *strchr(char ch[ ], char c)
strrchr
char *strrchr(char ch[ ], char c)

strstr
char *strstr(char ch1[ ], char ch2 [ ])

Recherche la 1re occurrence du caractre c dans la


chane ch. Retourne un pointeur sur cette 1re
occurrence si c est un caractre de s, sinon le pointeur
NULL est retourn
Identique strchr sauf qu'elle recherche la dernire
occurrence du caractre c dans la chane ch
Exemple
Char ch[20] = "Bonjour" ;
puts( strchr( ch , 'o' ) ) ; //Affiche : onjour
puts( strrchr( ch , 'o ) ) ; //Affiche : our
Recherche la chane ch2 dans la chane ch1 . Retourne
ladresse de la premire occurence de ch2 dans ch1 ou
NULL si ch2 nest pas trouv dans ch1
Exemple
char ch1[30] = "Bonjour tout le monde" ;
char ch2[10] = "tout" , pch[20] ;
pch = strstr(ch1, ch2) ;
printf("La sous-chane est : %s\n", pch) ; //Affiche : tout
le monde

100

101

Correction 2

Exercice

#include <stdio.h>
#include <string.h>
main()
{ char CH1[20], CH2[20]; int i=0,j=0,trouve=0;
printf("Donner la chaine CH1 :"); gets(CH1);
printf("\nDonner la chaine CH2 :"); gets(CH2);

Ecrire un programme C permettant de compter le nombre doccurrences


dun mot Mot dans une chaine CH

if(strstr(CH2, CH1))
printf("\nCH1 est incluse dans CH2");
else
printf("\n CH1 n est pas incluse dans CH2");
}

102

Correction
#include <stdio.h>
#include <string.h>
main()
{char CH[100], Rest[100], Mot[20];
int l, Cpt=0;
printf("Donner la chaine CH :"); gets(CH);
printf("Donner le mot recherch :"); gets(Mot);
l=strlen(Mot);
strcpy(Rest,CH);
if(strstr(Rest, Mot))
strcpy(Rest,strstr(Rest, Mot));
while(Rest)
{ Cpt++;
strcpy (Rest,Rest+l); // Recommencer la recherche aprs le Mot
if(strstr(Rest, Mot))
strcpy (Rest,strstr(Rest, Mot));
else
break;
}
printf("\nb occurence de %s : %d",Mot,Cpt);
}

104

103

Das könnte Ihnen auch gefallen