1. Programmation en langage C
Fahad R. Golra
Faculté des Sciences et Technologies
Université de Lorraine
Séance 4 – Pointeurs et Chaînes de caractères
2. 2 24/11/2017
Pointeurs
Programmation en langage C, Université de Lorraine
• On utilise des pointeurs dans :
• La transmission des arguments par pointeurs (résultats de
retour)
• La manipulation des tableaux
• Les chaînes de caractères
• Les fichiers : FILE * aLire, * aCreer
• Etc.
3. 3 24/11/2017
Pointeurs
Programmation en langage C, Université de Lorraine
• Un pointeur est une variable dont la valeur est une adresse
• Déclaration : type * identificateur ;
• PointeurSurEntier est une variable qui peut contenir l’adresse
mémoire d’une variable entière
• La valeur d’un pointeur étant une adresse, l’opérateur *
permet d’accéder à la valeur qui est à cette adresse
int *pointeurSurEntier;
int unEntier, *pointeurSurEntier = &unEntier;
int unEntier=5, unAutre, *pointeur = &unEntier;
unAutre = *pointeur /*unAutre prend la valeur 5*/
4. 4 24/11/2017
Operateurs & et *
Programmation en langage C, Université de Lorraine
• Adresse de : &
• Syntaxe : &variable , donne l'adresse mémoire de la variable
• Dont l'adresse est : *
• Syntaxe *expression : donne le mot mémoire dont l'adresse
est donnée par l'expression
int i, adr;
adr = &i;
int i, *adr;
i=1;
adr=&i;
printf("%d", *adr);
Affiche "1"
5. 5 24/11/2017
Exemple : Variable
Programmation en langage C, Université de Lorraine
• On définit ainsi une variable
a associée à un
emplacement mémoire
• Pour instancier a, il suffit
d’affecter une valeur à a
int a;
a= 5;
6. 6 24/11/2017
Exemple : Pointeurs
Programmation en langage C, Université de Lorraine
• On définit une pointeur p qui
va contenir une adresse :
l’adresse de l’objet que va
pointer la pointeur p, ici a.
• On ne peut affecter à p
qu’une adresse
int a;
int *p;
p = &a;
*p = 6;
De cette manière p va
pointer sur l’objet que
désigne l’identificateur a.
Ca va instancier l’objet que
pointe p
Quelle valeur est maintenant associée à a ? 6
7. 7 24/11/2017
Rappelez-vous !!! Fonctions
Programmation en langage C, Université de Lorraine
# include <stdio.h>
void permute(int*, int*);
int main(void)
{
int x = 3, y = 4;
permute (&x, &y);
printf("x = %dn", x);
printf("y = %dn", y);
return 0;
}
void permute(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
# include <stdio.h>
void permute(int, int);
int main(void)
{
int x = 3, y = 4;
permute (x, y);
printf("x = %dn", x);
printf("y = %dn", y);
return 0;
}
void permute(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
Passage par référence Passage par valeur
8. 8 24/11/2017
Chaîne de caractères
Programmation en langage C, Université de Lorraine
• On définit ainsi un pointeur
"chaine" qui va pointer sur
une zone mémoire de 8
octets consécutifs (nous
supposons ici qu’un
caractère ne nécessite qu’un
octet pour son codage).
char *chaine="bonjour";
*(chaine+1) caractère ‘o’
*(chaine+2) caractère ‘n’
*(chaine+3) caractère ‘j’
*(chaine+4) caractère ‘o’
*chaine caractère ‘b’
*(chaine+5) caractère ‘u’
*(chaine+6) caractère ‘r’
*(chaine+7) caractère ‘0’
le caractère nul ‘0’ termine toute
chaîne de caractère. C’est la raison
pour laquelle la chaîne de 7 caractères
˝bonjour˝ est représentée en mémoire
par une zone consécutive de 8 octets.
9. 9 24/11/2017
Chaîne de caractères
Programmation en langage C, Université de Lorraine
• On définit ainsi un pointeur
"chaine" qui va pointer sur
une zone mémoire de 8
octets consécutifs (nous
supposons ici qu’un
caractère ne nécessite qu’un
octet pour son codage).
char *chaine="bonjour";
| 'b' | 'o' | 'n' | 'j' | 'o' | 'u' | 'r' |'0'|
|_____|_____|_____|_____|_____|_____|_____|____|
Le ‘0’ marque la fin de la chaîne de caractères
10. 10 24/11/2017
Exemple 1– Chaînes de caractères
Programmation en langage C, Université de Lorraine
• Un programme qui initialise une variable pointeur adr qui
pointe sur la chaîne de caractères "bonjour" et qui affiche à
l’écran chaque caractère de "bonjour".
#include <stdio.h>
int main(void)
{
char *adr = "bonjour";
while (*adr)
{
printf (" %cn", *adr);
adr++;
}
return 0;
}
11. 11 24/11/2017
Chaîne de caractères (Explicit vs. Implicit)
Programmation en langage C, Université de Lorraine
• Lorsque l’on déclare une chaîne de n caractères à l’aide d’un
pointeur explicite, le compilateur réserve un emplacement
mémoire de n+1 octets exactement.
• Il est possible de déclarer une chaîne de n caractères à l’aide d’un
pointeur implicit :
char *chaine="bonjour"; 8 octets
char chaine[8]="bonjour";
12. 12 24/11/2017
Sur-dimmensionner une chaîne de caractères
Programmation en langage C, Université de Lorraine
• Il est possible de sur-dimmensionner une variable chaîne de
caractères ainsi :
• ch est un pointeur implicite qui pointe sur une zone mémoire
de 20 octets.
• Les 8 premiers octets sont initialisés avec les
caractères :{‘b’,’o’,’n’,’j’,’o’,’u’,’r’,’0’}.
• Les 12 autres octets de ch sont arbitraires.
• L’intérêt de sur-dimmensionner une chaîne de caractères sera vu
lorsque l’on traitera des fonctions standards de le bibliothèque de
chaîne de caractères <string.h>.
char ch[20]="bonjour";
13. 13 24/11/2017
Chaîne de caractères explicit
Programmation en langage C, Université de Lorraine
• À la différence d'un tableau,
les chaînes de caractères
respectent une convention :
se terminer par le caractère
nul, noté '0' (antislash-zero).
• Ainsi, pour construire une
chaîne de caractères « à la
main », il ne faut pas oublier
ce caractère final.
#include <stdio.h>
#include <string.h>
int main(void)
{
char chiffres[11];
int i;
for (i = 0 ; i < 10 ; i++)
chiffres [i] = '0' +i;
chiffres[10] = '0';
printf("chaine obtenue : %s",
chiffres);
return 0;
}
14. 14 24/11/2017
Chaîne de caractères explicit
Programmation en langage C, Université de Lorraine
• Il est possible de modifier
une chaîne de caractères
quelle que soit la manière
dont on la déclare .
• Dans cet exemple on a crée
une chaîne formée des 10
caractères correspondant
aux chiffres de 0 à 9 .
#include <stdio.h>
#include <string.h>
int main(void)
{
char chiffres[11];
int i;
for (i = 0 ; i < 10 ; i++)
chiffres [i] = '0' +i;
chiffres[10] = '0';
printf("chaine obtenue : %s",
chiffres);
return 0;
}
15. 15 24/11/2017
Fonctions principales
Programmation en langage C, Université de Lorraine
• Catégories importantes de fonctions pour les chaînes de
caractères :
• entrées-sorties standard de chaînes
• tailles de chaînes
• copie de chaînes
• concaténation de chaînes
• comparaison de chaînes
• recherche de caractères ou de sous-chaines dans une chaîne
• conversion de chaîne en nombre.
16. 16 24/11/2017
Entrées-sorties standard de chaînes
Programmation en langage C, Université de Lorraine
• Lecture au clavier d’une chaîne de caractères
• scanf
• gets
• Pour imprimer une chaîne de caractères à l’écran
• printf
• puts
17. 17 24/11/2017
Entrées-sorties – scanf / printf
Programmation en langage C, Université de Lorraine
• scanf("%s", char *chaine)
• Va saisir une chaîne
jusqu’à un séparateur.
• printf("%s", char *chaine)
• Va afficher à l’écran la
chaîne.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *ch;
printf("Entrez un phrase : ");
scanf("%s",ch);
printf("Le phrase est : %s", ch);
return 0;
}
18. 18 24/11/2017
Entrées-sorties – gets/ puts
Programmation en langage C, Université de Lorraine
• gets(char *chaine)
• Va saisir une chaîne
jusqu’au retour de chariot
(‘0’)
• puts(char *chaine)
• Va afficher à l’écran la
chaîne.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *ch;
printf("Entrez un phrase : ");
gets(ch);
printf("Le phrase est : ");
puts(ch);
return 0;
}
19. 19 24/11/2017
La fonction strlen
Programmation en langage C, Université de Lorraine
• La fonction strlen calcule le
nombre de caractères de la
chaîne passée en
paramètre (le caractère de
fin de chaîne : ‘0’) n’est pas
pris en compte.
size_t strlen(const char *s);
#include <stdio.h>
#include <string.h>
int main(void)
{
char *chaine1 = "bonjour";
char chaine2[10] = "salut";
int i = strlen(chaine1);
int j = strlen(chaine2);
printf("chaine1 : %sn", chaine1);
printf("taille chaine1 : %dn", i);
printf("chaine2 : %sn", chaine2);
printf("taille chaine2 : %dn", j);
return 0;
}
20. 20 24/11/2017
La fonction strcpy
Programmation en langage C, Université de Lorraine
• La fonction strcpy copie le
contenu de la chaîne source
dans la chaîne but.
• Retourne l'adresse de but.
char * strcpy (char *but, char *source)
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch1[20];
char ch2[10] = "bonjour";
char *ch3 = "salut";
strcpy(ch1, ch3);
printf("ch1 : %sn", ch1);
strcpy(ch1, ch2);
printf("ch1 : %sn", ch1);
strcpy(ch1, "hello");
printf("ch1 : %sn", ch1);
return 0;
}
21. 21 24/11/2017
La fonction strcpy -- Attention !!!
Programmation en langage C, Université de Lorraine
• La fonction strcpy n’effectue
aucun contrôle sur les
longueurs des chaînes source
et but. C’est le rôle du
programmeur de faire
attention à ce qu’il fait .
• ch contient 6 octets et la
chaîne "bonjour" nécessite 8
octets pour son stockage :
donc le strcpy va écraser 2
octets en fin de tableau ou
lancer une erreur.
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[6] = "hello";
strcpy(ch, "bonjour");
printf("ch : %sn", ch);
return 0;
}
22. 22 24/11/2017
La fonction strcat
Programmation en langage C, Université de Lorraine
• La fonction strcat permet de
concaténer deux chaînes de
caractères, i.e., de les mettre
bout à bout.
char *strcat ( char *but, char *source)
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[50] = "bonjour";
char *per = "monsieur";
printf("avant : %sn", ch);
strcat(ch, per);
printf("apres : %sn", ch);
return 0;
}
23. 23 24/11/2017
La fonction strcat – Attention!!!
Programmation en langage C, Université de Lorraine
• Aucun contrôle de longueur
n’est réalisé par la fonction
strcat :
• il faut que l’emplacement
réservé pour la première
chaîne soit suffisant pour
y recevoir la partie à lui
concaténer.
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[10]="bonjour";
char *per= "monsieur";
strcat(ch,per) ;
printf ("ch : %sn", ch);
return 0;
}
24. 24 24/11/2017
La fonction strcmp
Programmation en langage C, Université de Lorraine
• La fonction strcmp permet
de comparer deux chaînes
de caractères dans l’ordre
lexicographique.
• Retourne :
• négative si chaine1 arrive
avant chaine2
• positive si chaine1 arrive
après chaine2
• nulle si les deux chaînes
sont identiques.
int strcmp (char *chaine1, *chaine2)
#include <stdio.h>
#include <string.h>
int main(void)
{
int res;
res = strcmp("bonjour", "monsieur");
printf ("Comparaison : %dn", res);
res = strcmp("bonjour", "bonjour");
printf ("Comparaison : %dn", res);
res = strcmp("monsieur", "bonjour");
printf ("Comparaison : %dn", res);
return 0;
}
25. 25 24/11/2017
La fonction strchr
Programmation en langage C, Université de Lorraine
• La fonction strchr retourne
l’adresse de la première
occurrence du caractère
dans la chaîne, NULL si le
caractère n’y est pas.
char * strchr (char *chaine, char c)
#include <stdio.h>
#include <string.h>
int main(void)
{
char *ch ="bonjour";
ch=strchr (ch, 'o');
printf("Ch : %s", ch);
return 0;
}
26. 26 24/11/2017
La fonction strchr - Exemple
Programmation en langage C, Université de Lorraine
• ad contient l’adresse du
premier ‘e’ dans ch
• si ch contient le caractère 'e'
bloc1sera exécuté et sinon
c’est bloc2 qui est exécuté.
char * strchr (char *chaine, char c)
#include <stdio.h>
#include <string.h>
int main(void)
{
char *ch="bonjour monsieur";
char *ad = strchr(ch, 'e');
if(ad)
printf("ch contient en");
else
printf("ch ne contient pas en");
return 0;
}
27. 27 24/11/2017
La fonction strstr
Programmation en langage C, Université de Lorraine
• La fonction strstr permet de
rechercher la première
occurrence d’une chaîne
donnée (sous-chaîne) dans
une autre.
• Retourne l'adresse de la
première occurrence
complète de la sous-chaîne
cherchée, sinon NULL.
char *strstr (char *ch1, char *ch2)
#include <stdio.h>
#include <string.h>
int main(void)
{
char *ch ="bonjour monsieur";
char *per="monsieur";
ch=strstr(ch, per);
printf("Ch : %s", ch);
return 0;
}
28. 28 24/11/2017
La fonction strpbrk
Programmation en langage C, Université de Lorraine
• La fonction strpbrk permet
de rechercher dans une
chaîne la première
occurrence d’un des
caractères appartenant à un
ensemble.
• Retourne l'adresse de la
première occurrence dans
chaine1 de l’un des
caractères de chaine2, NULL
si inexistence.
char *strpbrk (char *ch1, char *ch2)
#include <stdio.h>
#include <string.h>
int main(void)
{
char *ch ="bonjour monsieur";
char *per="nancy";
ch=strpbrk(ch, per) ;
printf("Ch : %s", ch);
return 0;
}
29. 29 24/11/2017
Conversion de chaînes en nombres
Programmation en langage C, Université de Lorraine
• Les trois fonctions les plus
utilisées sont :
1. atof - une chaîne en double
2. atoi - une chaîne en int
3. atol - une chaîne en long
int
• La librairie à inclure est
stdlib.h
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double d;
int i;
long l;
char *chd = "-3.141592";
char *chi = "-122";
char *chl = "234567890";
d = atof(chd);
i = atoi(chi);
l = atol(chl);
printf("chd : %lfn", d);
printf("chi : %dn", i);
printf("chl : %ldn", l);
return 0;
}