Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

La librairie <stdlib.h> (<cstdlib> en C++)

La fonction abort


La librairie <stdlib.h> (pour standard library) propose des fonctions pour répondre à différentes problématiques. Tout d'abord, cette librairie vous permmettra de gérer la mémoire dynamiquement, en allouant ou libérant de la mémoire dans le tas (le heap en anglais). Elle vous permettra aussi de pouvoir interagir avec le système d'exploitation sur lequel le programme s'exécute. Cette librairie propose aussi un certain nombre d'autres fonctions utilitaires pour les convertions entre types de données, des algorithmes (tri, recherche dichotomique, génération de nombres pseudo-aléatoires, ...) et quelques autres possibilités.

Gestion dynamique de la mémoire

Un ensemble de fonctions standards permettent de gérer la mémoire. En règle générale, il vous faudra allouer des espaces de mémoires pour les besoins de votre programme. Mais dans ce cas, il faudra obligatoirement penser à la libérer après utilisation (sans quoi des fuites mémoire apparaissent au sein de votre programmes). Le tableau ci-dessous rappelle les fonctions utilisables.

Nom Type Description Depuis
aligned_alloc fonction Alloue un bloc de mémoire en garantissant que son adresse mémoire soit multiple d'une taille d'alignement. C11
calloc fonction Alloue un bloc de mémoire dans le tas (le heap, en anglais), en initialisant tous ces octets à la valeur 0. C89
free fonction Libère un bloc de mémoire alloué dynamiquement dans le tas (le heap, en anglais), via un appel à la fonction malloc (ou tout autre fonction d'allocation mémoire). C89
malloc fonction Alloue un bloc de mémoire dans le tas (le heap, en anglais). C89
realloc fonction Retaille un bloc de mémoire préalablement alloué via un appel à la fonction malloc (ou tout autre fonction d'allocation mémoire) C89

Interaction avec le système d'exploitation

D'autres fonctions existent au sein de cette librairie. Certaines d'entre elles permettent, notamment, de dialoguer avec le système d'exploitation hôte. Vous pouvez, par exemples, manipuler les variables d'environnement, demander l'exécution d'autres programmes, renvoyer un code de retour au système hôte, ...

Nom Type Description Depuis
abort fonction La fonction abort arrête, de mainière « anormale », l'exécution du programme et déclenche le signal SIGABRT pour en informer l'appelant. C89
atexit fonction Permet d'ajouter une fonction qui sera exécutée en sortie du processus (du programme) en cours. C89
at_quick_exit fonction Permet d'ajouter une fonction qui sera exécutée suite à un appel à la fonction quick_exit pour sortir du processus en cours. C11
exit fonction La fonction exit permet de mettre fin au programme en spécifiant un code de retour. C89
_Exit fonction La fonction _Exit permet de mettre fin au programme, de manière normal, mais sans réaliser les tâches de finalisation du processus et sans invoquer auncune fonction enregistrée sur la sortie du procéssus. C99
getenv fonction Renvoie le contenu d'une variable d'environnement du système d'exploitation. C89
quick_exit fonction La fonction quick_exit permet de mettre fin rapidement au programme en spécifiant un code de retour. C11
system fonction Exécute une commande sur le système d'exploitation hôte. C89

Quelques autres définitions sont associées à ces fonctions.

Nom Type Description Depuis
EXIT_FAILURE Macro Cette macro représente un code de sortie du processus en échec. C89
EXIT_SUCCESS Macro Cette macro représente un code de sortie du processus en succès. C89

De plus, n'oubliez pas que vous pouvez récupérer les arguments passés sur la ligne de commande à votre programme via les paramètres de la fonction main (les paramètres argc et argv).

Quelques algorithmes.

L'aléatoire est un concept qu'on a du mal à traiter en informatique, étant données que nos machines sont des systèmes déterministes. Actuellement, l'aléa est simulé via des algorithmes mathématiques qui renvoient des suites de valeurs. Si ces algorithmes sont utilisés plusieurs fois à la suite, ils ont le défaut de toujours renvoyer la même suite de valeurs. Pour contourner ce problème, on initialise souvent ces algorithmes avec une valeur imprédictible : pourquoi pas le temps système machine. La librairie <stdlib.h> propose deux fonctions pour ce sujet.

D'autres algorithmes sont aussi proposés par la librairie : recherche dichotomique, tri de tableaux d'entiers, ...

Nom Type Description Depuis
abs fonction Permet de calculer la valeur absolue d'un entier signé. C89
bsearch fonction La fonction bsearch (binary search) permet de réaliser une recherche dichotomique d'une valeur dans un tableau d'éléments triés. C89
div fonction Cette fonction réalise une division entière d'un dividende par un diviseur et vous renvoit le quotient et le reste de cette division. C89
labs fonction Permet de calculer la valeur absolue d'un entier long signé. C89
llabs fonction Permet de calculer la valeur absolue d'un entier très long signé (type long long). C99
ldiv fonction Cette fonction réalise une division entière (de type long) d'un dividende par un diviseur et vous renvoit le quotient et le reste de cette division. C89
lldiv fonction Cette fonction réalise une division entière (de type long long) d'un dividende par un diviseur et vous renvoit le quotient et le reste de cette division. C89
qsort fonction Permet de trier un tableau d'éléments. Le type des éléments contenus dans le tableau est laissé à votre discretion. C89
rand fonction Renvoie une valeur aléatoire comprise entre 0 et RAND_MAX. C89
srand fonction Initialise le générateur de nombres pseudo-aléatoires. C89

Quelques autres définitions sont associées à ces fonctions.

Nom Type Description Depuis
div_t structure Cette structure permet de stocker le quotient et le reste d'une division entière, dans des champs de type int. C89
ldiv_t structure Cette structure permet de stocker le quotient et le reste d'une division entière, dans des champs de type long. C89
lldiv_t structure Cette structure permet de stocker le quotient et le reste d'une division entière, dans des champs de type long long. C99
RAND_MAX macro S'expense en une valeur numérique représentant la plus grande valeur pouvant être renvoyée par le générateur de nombres pseudo-aléatoires (la fonction rand). C89

Fonctions de prise en charge des encodages pour vos chaînes de caractères

Le langage C ISO permet de gérer des chaînes de caractères utilisant divers encodages. Assez souvent, nous utilisons un encodage relativement simple : un caractère est stocké sur un octet. C'est le cas des encodages ASCII ou ISO-8859-1. Ce dernier étant très souvent utilisé par défaut sur un système Windows configuré en français.

Mais ça peut être plus compliqué : un caractère peut être encodé sur plusieurs octets et il se peut même que pour deux caractères d'une même table d'encodage, la taille change. C'est notamment le cas de l'encodage UTF-8, une déclinaison d'Unicode.

Unicode (plus formellement, ISO-10646) est un standard d'encodage de caractères proposant plus de 130 000 caractères (Unicode 12.0). L'encodage UTF-8 prend en charge UNICODE en essayant de rester sur le ratio 1 caractère/1 octet, du moins tant que possible. Pour l'utiliser en C, il est nécessaire de changer la localisation utilisée par votre programme grâce à la fonction setlocale. Vous pouvez définir des chaînes de caractères C utilisant l'encodage grâce au préfixe u8, comme le montre l'exemple ci-dessous. Pour injecter un caractère étendu dans une chaîne C, utilisez le préfixe \u suivit du code hexadécimal du caractère souhaité.
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>


int main() {

    // On se place en mode UTF-8 pour gérer des caractères multi-octets.
    setlocale( LC_ALL, "en_US.utf8" );

    // On crée une chaîne avec des caractères multi-octets en utilisant l'encodage UTF-8.
    const char * str = u8"\u03c0 est un sigle mathématique. \u4774 est un idéogramme chinois.";

    // On affiche notre chaîne de caractères encodée en UTF-8
    printf( "%s\n", str );

    return EXIT_SUCCESS;
}
Exemple d'utilisation d'une chaîne encodée en UTF-8

Le résultat affiché sera : π est un sigle mathématique. 䝴 est un idéogramme chinois.

veuillez consulter le site suivant pour visualiser l'ensemble des caractères Unicode disponibles : https://unicode-table.com.

Voici la liste des définitions proposées par <stdlib.h> pour la gestion des encodages de chaînes de caractères.

Nom Type Description Depuis
MB_CUR_MAX macro Renvoi la longueur maximale d'un caractère multi-octets dans la localisation courante. C89
mblen fonction Permet de déterminer la taille, en nombre d'octets, du premier caractère d'une chaîne multi-octets. C89
mbstowcs fonction Permet de transformer une chaîne de caractères « multibytes » (de type char *) en une chaîne de caractères « wide characters » (de type wchar_t *), dans la limite d'un nombre de caractères maximal à ne pas dépasser. C89
mbtowc fonction Permet de transformer un caractère « multibytes » (stocké sur un ou plusieurs octets) en un « wide characters » (de type wchar_t). C89
wcstombs fonction Permet de transformer une chaîne de caractères « wide characters » (de type wchar_t *) en une chaîne de caractères « multibytes » (de type char *), dans la limite d'un nombre de caractères maximal à ne pas dépasser. C89
wctomb fonction Permet de transformer un caractère « wide characters » (de type wchar_t) en un caractère « multibytes » (stocké sur un ou plusieurs octets). C89

Fonctions de conversions de chaînes de caractères en valeurs numériques

Les fonctions suivantes permettent de convertir des chaînes de caractères (char *) en valeurs numériques de différents types (int, long, double, ...). Attention, certaines de ces fonctions ne permettent pas de savoir si la conversion s'est bien passées : par exemple, la fonction atoi (Ascii TO Integer) renverra 0 si vous l'invoquez ainsi : int value = atoi( "toto" );. Comment distinguer ce cas de l'appel suivant : int value = atoi( "0" );. C'est pour cette raison, que je vous conseille plutôt l'emploi des fonctions commençant pas str : elles permettent de savoir si la conversion s'est bien ou mal passée.

Nom Type Description Type de destination Depuis
atof fonction Conversion d'une chaîne de caractères en un flottant double précision. double C89
atoi fonction Conversion d'une chaîne de caractères en un entier. int C89
atol fonction Conversion d'une chaîne de caractères en un entier long. long C89
atoll fonction Conversion d'une chaîne de caractères en un entier très long. long long C99
strtod fonction Conversion d'une chaîne de caractères en un flottant double précision. double C89
strtof fonction Conversion d'une chaîne de caractères en un flottant simple précision. float C99
strtol fonction Conversion d'une chaîne de caractères en un entier long. long C89
strtold fonction Conversion d'une chaîne de caractères en un flottant double précision long. long double C99
strtoll fonction Conversion d'une chaîne de caractères en un entier très long. long long C99
strtoul fonction Conversion d'une chaîne de caractères en un entier long non signé. unsigned long C89
strtoull fonction Conversion d'une chaîne de caractères en un entier très long non signé. unsigned long long C99


La fonction abort