Le fichier en-tête string.h contient des déclarations de
fonctions permettant la manipulation de chaînes de caractères :
- char *strcpy(char *s1, const char *s2) copie la chaîne
s2, y compris le caractère
0,
dans la chaîne s1. Elle retourne la chaîne s1,
- char *strncpy(char *s1, const char *s2, int n) copie
au plus n caractères de la chaîne s2 dans la chaîne
s1 laquelle est complétée par des
0
dans le cas ou la chaîne s2 contient moins de n
caractères. Cette fonction retourne la chaîne s1,
- char *strdup(char *s) retourne un pointeur sur une zone
allouée dynamiquement contenant la duplication de l'argument s,
- char *strcat(char *s1, const char *s2) concatène la
chaîne s2 à la chaîne s1. Cette fonction retourne
la chaîne s1,
- char *strncat(char *s1, const char *s2, int n) concatène
au plus n caractères de la chaîne s2 à la chaîne
s1 qui est ensuite terminée par
0.
Cette fonction retourne la chaîne s1.
- int strcmp(const char *s1, const char *s2) compare la
chaîne s1 à la chaîne s2. Les chaînes sont comparées
caractère par caractère en partant de la gauche. Cette fonction retourne
:
- une valeur négative dès qu'un caractère de la chaîne s1 est
plus petit que celui de la chaîne s2,
- une valeur positive dès qu'un caractère de la chaîne s1 est
plus grand que celui de la chaîne s2,
- 0 si les deux chaînes sont identiques.
- int strncmp(const char *s1, const char *s2, int n) compare
au plus n caractères de la chaîne s1 à la chaîne
s2. La valeur retournée par cette fonction est identique
à celle retournée par la fonction strcmp,
- char *strchr(const char *s, int c) retourne un pointeur
sur la première occurrence du caractère c dans la chaîne
s, ou NULL si c ne figure pas dans s,
- char *strrchr(const char *s, int c) retourne un pointeur
sur la dernière occurrence du caractère c dans la chaîne
s, ou NULL si c ne figure pas dans s,
- char *strstr(const char *s1, const char *s2) retourne
un pointeur sur la première occurrence de la chaîne s2 dans
la chaîne s1, ou NULL si elle n'y figure pas.
- size_t strlen(const char *s) retourne la longueur de la
chaîne s.
Le type size_t est un alias du type unsigned long.
Exemple
#include <stdio.h>
#include <string.h>
main(int argc, char **argv)
{
char *parm1, *parm2, buffer[BUFSIZ];
if (argc != 3) usage(argv[0]);
parm1 = strdup(argv[1]);
parm2 = strdup(argv[2]);
strcat(strcpy(buffer, "Resultat de la "
"concatenation : "),
parm1);
strcat(strcat(buffer, parm2), "\n");
printf("%s", buffer);
sprintf(buffer, "%s%s%s\n", "Resultat de la "
"concatenation : ",
parm1, parm2);
printf("%s", buffer);
free(parm1); free(parm2);
}
void usage (char *s) {
fprintf(stderr, "usage : %s ch1 ch2.\n", s);
exit(1);
}
Il existe d'autres fonctions qui agissent sur des tableaux de caractères
plutöt que des chaînes de caractères :
- void *memcpy(void *m1, void *m2, size_t n) copie n
caractères de la zone mémoire m2 dans la zone mémoire m1
et retourne m1,
- void *memmove(void *m1, void *m2, size_t n) est identique
à memcpy mais fonctionne également dans le cas ou les zones
mémoires m1 et m2 se chevauchent,
- int memcmp(void *m1, void *m2, size_t n) compare les
n premiers caractères des zones mémoires m1 et m2.
La valeur de retour se détermine comme pour strcmp,
- void *memchr(void *m, int c, size_t n) retourne un pointeur
sur la première occurrence du caractère c dans la zone mémoire
m, ou {NULL si c n'y figure pas,
- void *memset(void *m, int c, size_t n) remplit les n
premiers caractères de la zone mémoire m avec le caractère
c et retourne m.
Exemple
#include <stdio.h>
#include <string.h>
main()
{
char buffer[100];
char tab[] = "Voici\0une chaine qui"
"\0\0contient\0des"
"\0caracteres \"null\".";
char *p, *ptr;
int taille = sizeof tab / sizeof tab[0];
int n;
memset(buffer, ' ', 100);
memcpy(buffer, tab, taille);
n = --taille;
for (p=ptr=tab; p=memchr(ptr, '\0', n);)
{
*p = ' ';
n -= p - ptr + 1;
ptr = ++p;
}
printf("%s\n", buffer);
printf("%.*s\n", taille, tab);
}
Pr. Marc BUFFAT
buffat@ufrmeca.univ-lyon1.fr
2004-12-01