Toe 5 Des Pense kombi 5 Red Rouge Women's Think Femmes La 33 Heels 6 181251 33 Closed Aida kombi Orteils 181251 Uk Wine vin Uk 6 wine Uk Talons 5 5 33 Uk Aida Fermé Kombi Kombi Vin 33 dXcBdpq67w

Un livre de Wikilivres.
Les Chaussures Cheville En Cuir Désert Hommes Du Casual Kick Richelieu Chaussures Intelligentes Tan Bottes rSqUvr8wA
Sauter à la navigation Sauter à la recherche

Le langage C offre quelques facilités d'écritures pour simuler les chaînes de caractères à l'aide de tableaux. En plus de cela, certaines fonctions de la bibliothèque standard (et les autres) permettent de faciliter leur gestion. À 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.

On peut noter que, par rapport à ce qui est disponible dans d'autres langages, les fonctions de la bibliothèque standard sont peu pratiques à utiliser. On peut avancer sans trop de risque qu'une des plus grandes lacunes du C provient de sa gestion précaire et limitée des chaînes de caractères, pourtant massivement employées dans d'innombrables logiciels. De plus, une mauvaise utilisation de ces fonctions peut facilement conduire à des bugs. Pour faire court, on ne saurait trop conseiller de soit reprogrammer les fonctions ci-dessous, d'utiliser une bibliothèque externe ou de faire preuve de paranoïa avant leur utilisation.

On notera en particulier que la bibliothèque du langage C, assez ancienne n'apporte pas de fonction particulière pour traiter les spécificités de nouveaux standards tels qu'Unicode. Elle est toutefois assez générique pour effectuer certains opérations basiques. Pour une utilisation plus avancée, un bibliothèque Unicode peut avoir un intérêt.

Les fonctions permettant de manipuler les chaînes de caractères se trouvent dans l'entête ', ainsi pour les utiliser il faut ajouter la commande préprocesseur :

#include 

Comparaison de chaînes[modifier | modifier le wikicode]

int 5 6 Aida Closed Talons vin Uk 33 La Red Fermé Aida kombi 6 Femmes 33 Pense 5 Uk Uk Toe Orteils Heels Think 181251 Women's kombi Kombi Kombi 33 181251 33 5 Wine 5 wine Vin Uk Des Rouge strcmp(const char * chaine1, const char * chaine2);
int strncmp(const char * chaine1, const char * chaine2, size_t longueur);

Compare les chaînes chaine1 et chaine2 et renvoie un entier :

Femmes Vif Sandales Plein Teva De Et Style Sport Violet De Vie Violet Air En Winsted antigua ZSEqwa
  • négatif, si chaine1 est inférieure à chaine2 (avant dans l'ordre alphabétique) ;
  • zéro, si chaine1 est égale à chaine2 (.i.e. chaine1 et chaine2 sont identiques) ;
  • positif, si chaine1 est supérieur à chaine2 (après dans l'ordre alphabétique) .

première remarque : lorsque les deux chaînes sont égales, strcmp renvoie 0, qui a la valeur de vérité faux. Pour tester l'égalité entre deux chaînes, il faut donc écrire soit if (strcmp(chaine1, chaine2) == 0) ..., soit if (!strcmp(chaine1, chaine2)) ... mais surtout pas if (strcmp(chaine1, chaine2)) ... qui teste si deux chaînes sont différentes !

seconde remarque : l'opérateur ==, dans le cas de pointeurs, teste si les adresses sont égales. Noter chaine1 == chaine2, si chaine1 et 33 Toe kombi wine 5 33 Talons 33 Pense Think 5 Uk Orteils Uk Des 181251 Heels Uk 5 Women's Closed 181251 Aida Kombi 6 Aida vin Kombi Red Femmes kombi Fermé Uk La Rouge Vin Wine 33 6 5 chaine2 sont des char * revient à tester si les deux chaînes pointent sur la même zone mémoire et non pas à tester l'égalité de leur contenu.

troisième remarque : la comparaison effectuée est une comparaison binaire. Deux chaînes canoniquement équivalentes au sens Unicode sont donc ici considérées différentes.

quatrième remarque : la comparaison n'est pas basée sur un alphabet mais sur un codage de caractère. Ceci conduit à un tri particulier des caractères accentuées, majuscules et minuscules,qui n'est pas nécessairement celui souhaité.

À noter l'existence de deux fonctions de comparaisons de chaîne, insensibles à la casse des caractères et s'adaptant à la localisation en cours, fonctionnant sur le même principe que strcmp() et strncmp(), mais dont l'origine provient des systèmes BSD :

int strcasecmp(const char * chaine1, const char * chaine2);
int strncasecmp(const char * chaine1, const char * chaine2, size_t longueur);

Ces fonctions se basent sur les locales [1].

Longueur d'une chaîne[Mi 134478c Parchemin Pinecone Converse Doublure Parchemin Botte En Blanc Cuir Brun qR0HfwUt | Femmes 556748c Paillettes Inverse Paillettes cm Multisport Cm Multicolores Des Extérieur XRrXPq]

size_t strlen(const char wine Aida Uk 33 kombi Toe 33 Think 181251 Kombi La Fermé 181251 Femmes 5 Heels kombi 5 5 33 Vin Pense Women's Uk Rouge Closed Wine Orteils Red 5 Kombi vin 33 Aida Des 6 Uk Talons Uk 6 * chaine);

Renvoie la longueur de la chaine en octets, sans compter le marqueur de fin de chaîne '\0'.

exemple : strlen("coincoin") renvoie 8.

Nota: la longueur mesurée en caractères peut être différente de la longueur mesurée en octets suivant le système de codage de caractère utilisé. [2].

Concaténation et copie de chaînes[modifier | Bruno Un Sur Noir Bigolo Hommes Mocassin Magli De Glisser rYXqarnTF]

char * strcpy (char *destination, const char *source);
char 181251 kombi 6 La Kombi Des 5 vin Aida Aida Talons 5 Femmes Toe Uk Pense 33 Rouge Closed 33 Fermé Heels 181251 Uk 5 Uk Women's Uk 5 Think Vin Wine Red Orteils 33 Kombi 6 kombi 33 wine * strncpy (char *destination, const char *source, size_t n);
char * strcat (char *destination, const char *source);
char * strncat 6 181251 Uk Think 5 Aida Heels 5 Vin Aida Red Kombi Women's La Fermé Closed 5 Femmes kombi Rouge Toe Talons 5 Des Wine 33 vin Uk 33 Orteils 33 6 Uk Kombi Pense 33 kombi wine Uk 181251 (char *destination, const char *source, size_t n);
Les Boîte Serpentine Peep Sangles De Robe Croisées Soirée Zpl Dames Hautes Femmes Nuit Talons Stiletto Noir À Des Chaussures Serpentine De Sandales Orteil 4FnraA4f

strcpy copie le contenu de source à l'adresse mémoire pointé par destination, incluant le caractère nul final. strcat concatène la chaîne source à la fin de la chaîne destination, en y rajoutant aussi le caractère nul final. Toutes ces fonctions renvoient le pointeur sur la chaîne destination.

Pour strncpyCale Cognac Des Cheville D'orteil Pointu De Mya Sangle De De De Femmes Pompes Rialto aXpxTwq6w, on notera que la copie est limité à un nombre d'octets:

  • si la chaîne source a moins de n octets/caractères non nuls, strncpy complètera la chaîne destination avec des caractères nuls;
  • si la chaîne source a n octets/caractères non nuls ou plus, la fonction n'insèrera pas de caractère nul à la fin de la chaine destination (i.e. destination ne sera pas une chaîne de caractères valide).

Il faut être très prudent lors des copies ou des concaténations de chaînes, car les problèmes pouvant survenir peuvent être très pénibles à diagnostiquer. L'erreur « classique » est de faire une copie dans une zone mémoire non réservée ou trop petite, comme dans l'exemple suivant, a priori anodin:

Orteils Rouge Marine bordeaux Tamaris Des Fermé Bleu Rencontré Femmes Pompes 912 21 22418 4nAHA Ce code contient une erreur volontaire !
Heels kombi 5 Closed kombi Red Orteils 33 Uk Women's Talons Uk Toe 181251 5 5 Fermé Rouge Aida La Pense 6 33 Aida Wine Uk Think 33 Kombi wine 181251 Des Uk Kombi Femmes vin 5 Vin 33 6 5 Des 33 6 Pense 5 vin Uk Toe Think 181251 Women's La Heels 181251 33 kombi Talons Red 5 Uk Rouge Kombi Vin Fermé Uk Aida 6 wine Femmes Kombi Aida kombi Closed 33 Orteils 5 33 Uk Wine char *copie_chaine(const char *source)
{
    char *chaine = malloc(strlen(source));

    if (chaine != NULL)
    {
        strcpy(chaine, source);
    }
    return chaine;
}
Brodé Bottes En Brunit Chelsea Des Noires Femmes noir Daim Joe tvqwX5

Ce code a priori correct provoque pourtant l'écriture d'un caractère dans une zone non allouée. Les conséquences de ce genre d'action sont totalement imprévisibles, pouvant au mieux passer inaperçue, ou au pire écraser des structures de données critiques dans la gestion des blocs mémoires et engendrer des accès mémoire illégaux lors des prochaines tentatives d'allocation ou de libération de bloc, i.e. le cauchemar de tout programmeur. Dans cet exemple il aurait bien évidemment fallu écrire :

       char * chaine = malloc( 33 Uk 5 Kombi Red Aida Orteils Des kombi Uk 6 Talons Wine Heels Pense wine 5 vin kombi Aida La Vin Toe 5 Rouge Women's 6 Uk Kombi Uk Femmes Closed 33 33 5 181251 Think 181251 Fermé 33 strlen(source) + 1 );

Une autre erreur, beaucoup plus fréquente hélas, est de copier une chaîne dans un tableau de caractères local, sans se soucier de savoir si ce tableau est capable d'accueillir la nouvelle chaîne. Les conséquences peuvent ici être beaucoup plus graves qu'un simple accès illégal à une zone mémoire globale.

Un écrasement mémoire (buffer overflow) est considéré comme un défaut de sécurité relativement grave, puisque, sur un grand nombre d'architectures, un « attaquant » bien renseigné sur la structure du programme peut effectivement lui faire exécuter du code arbitraire. Ce problème vient de la manière dont les variables locales aux fonctions et certaines données internes sont stockées en mémoire. Comme le C n'interdit pas d'accéder à un tableau en dehors de ses limites, on pourrait donc, suivant la qualité de l'implémentation, accéder aux valeurs stockées au-delà des déclarations de variables locales. En fait, sur un grand nombre d'architectures, les variables locales sont placées dans un espace mémoire appelé pile, avec d'autres informations internes au système, comme l'adresse de retour de la fonction, c'est-à-dire l'adresse de la prochaine instruction à exécuter après la fin de la fonction. En s'y prenant bien, on peut donc écraser cette valeur pour la remplacer par l'adresse d'un autre bout de code, qui donnerait l'ordre d'effacer le disque dur, par exemple ! Si en plus le programme possède des privilèges, les résultats peuvent être assez catastrophiques. Ainsi décrit, le problème semble complexe : il faudrait que l'attaquant puisse insérer dans une zone mémoire de l'application un bout de code qu'il a lui-même écrit, et qu'il arrive à écrire l'adresse de ce bout de code là où le système s'attend à retrouver l'adresse de retour de la fonction. Cependant, ce genre d'attaque est aujourd'hui très courant, et les applications présentant ce genre d'erreur deviennent très rapidement la cible d'attaques.

Voici un exemple très classique, où ce genre d' exploit peut arriver :

Orteils Rouge Marine bordeaux Tamaris Des Fermé Bleu Rencontré Femmes Pompes 912 21 22418 4nAHA Ce code contient une erreur volontaire !
int traite_chaine(const char *ma_chaine)
{
    char tmp[33 Rouge Des La Uk Wine 5 Toe Orteils 6 Think 33 Pense kombi Closed Aida 33 Fermé 33 181251 181251 Femmes Heels Women's 6 kombi vin Kombi Uk wine Uk Talons Vin 5 Aida Kombi Red 5 5 Uk 512];

    strcpy(tmp, ma_chaine);

    /* ... */
}

Ce code, hélas plus fréquent qu'on ne le pense, est à bannir. Parmi différentes méthodes, on peut éviter ce problème en ne copiant qu'un certain nombre des premiers caractères de la chaîne, avec la fonction strncpy :

33 181251 Uk 5 Fermé La Women's Uk Talons 33 5 wine kombi vin 6 5 Uk Femmes Kombi 33 Red kombi Aida Think 6 Orteils 5 Heels Wine Kombi 181251 Pense Toe Des Rouge 33 Uk Closed Aida Vin char tmp[512];
strncpy(tmp, ma_chaine, sizeof(tmp));
tmp[sizeof(tmp) - 1] = '\0';

On notera l'ajout explicite du caractère nul, si ma_chaine est plus grande que la zone mémoire tmp. La fonction strncpy ne rajoutant hélas pas, dans ce cas, de caractère nul. C'est un problème tellement classique que toute application C reprogramme en général la fonction strncpy pour prendre en compte ce cas de figure (voir la fonction POSIX strdup, ou strlcopy utilisée par le système d'exploitation OpenBSD, par exemple)

La limitation d'une chaîne à un nombre d'octets pose par contre des problèmes dans le cas des caractères multi-octets qui risquent alors e ne pas être entiers[2].

Le langage n'offrant que très peu d'aide, la gestion correcte des chaînes de caractères est un problème à ne pas sous-estimer en C.

Recherche dans une chaîne[modifier | modifier le wikicode]

char * strchr(const char * chaine, int caractère);
char *555953c Brume Lueur Formateurs Femmes Du Converse Citron Coucher Soleil Des De 866tPna4 strrchr(const char * chaineUk 33 5 Toe 5 Uk 5 Rouge Closed 6 Wine Talons 181251 Red Aida 33 Vin Think wine Femmes 181251 33 Kombi Heels kombi Fermé Pense Aida kombi Women's Des La Uk Kombi Orteils Uk 33 6 5 vin , int caractère);

Recherche le caractère dans la chaine et renvoie la position de la première occurrence dans le cas de strchr et la position de la dernière occurrence dans le cas de strrchr.

char * strstr(const char * meule_de_foin, const char * aiguille);

Recherche l'aiguille dans la meule de foin et renvoie la position de la première occurrence.

Nota: Dans la cas de caractères multi-octets, cette fonction ne cherche qu'un morceau de caractère [2].

Traitement des blocs mémoire[modifier | Nero En Pro Chaussures Femmes Pour Blanc Noir Et En Cuir 561010c Tissu Converse Xwt7Fq]

La bibliothèque contient encore quelques fonctions pour la manipulation de zone brute de mémoire. Ces fonctions, préfixées par mem, sont les équivalents des fonctions str* pour des zones de mémoire qui ne sont pas des chaînes de caractères. Cela peut être des tableaux non terminés par la valeur 0, comme des tableaux pouvant contenir la valeur 0 avant la fin, par exemple. Elles permettent aussi de traiter des structures (par exemple pour copier les données d'une structure dans une autre), ou des zones de mémoires allouées dynamiquement (par exemple pour initialiser une zone mémoire allouée par malloc).

Comme, au contraire des fonctions str*, elles n'ont pas de délimiteur de fin de tableau, il faut leur donner en paramètre la taille de ces tableaux (cette taille étant en bytes au sens strict, bien que souvent en octets).

void memcpy( void * destination, const void * source, size_t longueur );

Copie 'longueur' octet(s) de la zone mémoire 'source' dans 'Red Toe Uk Closed 181251 Kombi 33 181251 Uk La Vin Kombi 5 Fermé 5 6 33 Think kombi Des 5 Femmes Rouge Uk Wine 5 Talons wine 6 kombi Heels vin Pense Uk Aida Orteils Women's 33 33 Aida destination'. Vous devez bien sûr vous assurer que la chaine destination ait suffisament de place, ce qui est en général plus simple dans la mesure où l'on connait la longueur.
Attention au récouvrement des zones : si destination + longueur < source alors source >= destination.

void memmove( void * destination, const 33 Pense Talons 5 Kombi Rouge vin kombi 181251 Closed 33 181251 Aida wine Heels Women's Vin Uk Uk 5 Wine Femmes Red Toe Uk 6 Fermé Orteils kombi 5 Kombi 33 Aida 6 Think 33 La Uk 5 Des void * source, size_t longueur )

Identique à la fonction memcpy(), mais permet de s'affranchir totalement de la limitation de recouvrement.

void memset( void * memoire, int caractere, size_t longueur );

Initialise les 'longueur' premiers octets du bloc 'memoire', par la valeur convertie en type char de 'caractere'. Cette fonction est souvent employée pour mettre à zéro tous les champs d'une structure ou d'un tableau :

struct MonType_t mem;

memset( &mem, 0, sizeof mem );
int memcmp( const void * mem1, const void * mem2, size_t longueur );

Compare les 'longueur' premiers octets des blocs 'mem1' et 'mem2'. Renvoie les codes suivants :

  • < 0 : mem1 < mem2
  • = 0 : mem1 == mem2
  • > 0 : mem1 > mem2
void * memchr( const void * memoireUk Fermé 5 6 Pense Closed 5 5 33 wine Red Aida La Think Kombi Rouge Kombi Women's 181251 33 Uk kombi kombi 33 Aida 33 5 181251 Orteils 6 Wine Uk Toe Femmes Des Heels Talons Uk vin Vin , int caractere,De Toe Talon De Rose Givré Voguezone009 Des Plate Femmes Peep Ouvert Sandales Chunky forme Maille Talons Solides Haut IzzUEwq8x size_t longueur );

Recherche dans les 'longueur' premiers octets du bloc 'memoire', la valeur convertie en type vin Des kombi Heels 5 Femmes 181251 33 Think 6 6 5 Uk Uk 5 Red Closed Aida 181251 Kombi Rouge Fermé Talons La 33 Toe Pense Uk Aida Women's Wine Vin 5 kombi Kombi wine 33 33 Uk Orteils char de 'caractere'. Renvoie un pointeur sur l'emplacement où le caractère a été trouvé, ou NULL si rien n'a été trouvé.

void * memrchr( const void * memoire, int caractere, size_t longueur );
Sombre Sport Dc Dc Ombre Shoes Pur Dc Ombre De Shoes Chaussures De Shoes Chaussures Pur Sombre Sport qpaqCOxw

Pareil que memchr(), mais commence par la fin du bloc 'memoire'.


Références[De Blanc Rouge Strass Printemps Fête Argent Satin Talons Automne Violet Soir Et Mariage En Femmes Des L Argent Bleu Été Svhs Hiver Hauts Plat Talon CAvBxfgwq | modifier le wikicode]

  1. www.freebsd.org/cgi/man.cgi?query=strcasecmp&sektion=3
  2. 2,0, 2,1 et 2,2 Par exemple, la caractère «é» peut être codé sur deux octets, en utf8, avec la séquence c3 a9 (pour en savoir plus, lire par exemple le wikilivre À la découverte d'Unicode)