# String.h

<string.h> est l'en-tête de la bibliothèque standard du langage C qui contient les définitions des macros, des constantes et les déclarations de fonctions et de types utilisés non seulement pour la manipulation de chaînes de caractères, mais aussi pour diverses fonctions de manipulations de la mémoire.
Les fonctions déclarées dans string.h sont extrêmement utiles, puisqu'en tant que part de la bibliothèque standard C, il est certain qu'elles fonctionnent sur toute plate-forme qui supporte le langage C. Malgré tout, quelques problèmes de sécurité existent avec ces fonctions, comme des débordements de tampon, ce qui mène les programmeurs à préférer des solutions plus sûres, mais peut-être moins portables. De plus, ces fonctions ne sont compatibles qu'avec l'ASCII ou des codages semblables comme l'ISO-8859-1 ; les codages de caractères multibyte, tels qu'UTF-8, posent le problème que la « longueur » des chaînes est interprétée comme un nombre d'octets, plutôt que comme un nombre de caractères Unicode. La manipulation des chaînes de type non-ASCII est généralement réalisée à travers wchar.h.

## Constantes et types

| Nom | Notes |
| NULL | macro exprimant le pointeur nul, cette constante représente la valeur du pointeur pour laquelle on est sûr qu'elle ne désigne ni une adresse valide, ni un objet en mémoire |
| size_t | un entier non signé qui correspond au résultat de l'opérateur sizeof |

## Fonctions

| Nom | Notes |
| void *memcpy(void *dest, const void *src, size_t n); | copie n octets entre deux zones mémoire, qui ne doivent pas se superposer |
| void *memmove(void *dest, const void *src, size_t n); | copie n octets entre deux zones mémoire ; à la différence de memcpy, les zones mémoire peuvent se superposer |
| void *memchr(const void *s, int c, size_t n); | retourne en pointeur la première occurrence c parmi les n premiers octets de s, ou NULL si c n'est pas trouvé |
| int memcmp(const void *s1, const void *s2, size_t n); | compare les n premiers caractères de deux zones mémoire |
| void *memset(void *, int, size_t); | remplit une zone mémoire de la répétition d'un caractère |
| char *strcat(char *dest, const char *src); | concatène la chaîne src à la suite de dest |
| char *strncat(char * dest, const char * src, size_t n); | concatène au plus n caractères de la chaîne src à la suite de dest |
| char *strchr(const char *, int); | cherche un caractère dans une chaîne et renvoie un pointeur sur le caractère, en cherchant depuis le début |
| char *strrchr(const char *, int); | idem que strchr, recherche à partir de la fin |
| int strcmp(const char *, const char *); | compare deux chaînes lexicalement |
| int strncmp(const char *, const char *, size_t n); | compare les n premiers octets au plus de deux chaînes en utilisant l'ordre lexicographique |
| int strcoll(const char *, const char *); | compare deux chaînes en utilisant l'ordre lexicographique |
| char *strcpy(char *toHere, const char *fromHere); | copie une chaîne de caractères d'une zone à une autre |
| char *strncpy(char *toHere, const char *fromHere, size_t n); | copie au plus n caractères d'une chaîne d'une zone à une autre |
| char *strerror(int); | retourne la chaîne de caractères correspondant à un numéro d'erreur |
| size_t strlen(const char *); | retourne la longueur d'une chaîne caractères |
| size_t strspn(const char *s, const char *accept); | détermine la taille de la sous-chaîne initiale maximale de s ne contenant que des caractères présents dans accept |
| size_t strcspn(const char *s, const char *reject); | détermine la taille de la sous-chaîne initiale maximale de s ne contenant pas de caractères de reject |
| char *strpbrk(const char *s, const char *accept); | trouve la première occurrence d'un caractère d'accept dans s |
| char *strstr(const char *haystack, const char *needle); | trouve la première occurrence de la chaîne needle dans la chaîne haystack |
| char *strtok(char *, const char *); | scinde une chaîne en éléments lexicaux. Note: la fonction modifie la chaîne passée en paramètre. |
| size_t strxfrm(char *dest, const char *src, size_t n); | transforme src de façon que le tri par ordre lexicographique de la chaîne transformée soit équivalent au tri par ordre lexicographique de src. |

### Extensions à ISO C

| Nom | Notes | Spécification |
| char *strdup(const char *); | alloue et duplique une chaîne en mémoire | POSIX ; une extension de BSD au départ |
| errno_t strcpy_s(char *restrict s1, rsize_t s1max, const char *restrict s2); | variante de strcpy qui vérifie les tailles en mémoire | ISO/IEC WDTR 24731 |
| void *mempcpy(void *dest, const void *src, size_t n); | variante de memcpy donnant un pointeur sur l'octet suivant le dernier écrit | GNU |
| void *memccpy(void *dest, const void *src, int c, size_t n); | copie au plus n octets entre deux zones mémoire, qui ne doivent pas se superposer, en s'arrêtant quand le caractère c est trouvé | UNIX 98? |
| int strerror_r(int, char *, size_t); | retourne la représentation en chaîne d'un code d'erreur dans un tampon spécifié par l'utilisateur (version de strerror compatible avec les threads). La version GNU retourne un pointeur vers la chaîne représentant l'erreur. | XSI, POSIX |
| size_t strlcpy(char *dest, const char *src, size_t n); | variante de strcpy qui vérifie la taille des zones allouées | à l'origine OpenBSD, également FreeBSD, Solaris, Mac OS X |
| char *strtok_r(char *, const char *, char **); | version de strtok compatible avec les threads | POSIX |
| char *strsignal(int sig); | tout comme strerror, renvoie une description textuelles d'un signal (fonctionnement non garanti avec les threads) | BSDs, Solaris, Linux |

## Liens internes

* Langage C
* Bibliothèque standard du C