print · rss · source

< Passer des arguments à un programme | TutoCFrench | Types de données composés et type dérivés >


Les fonction d'entrée/sortie

Notions :

  • printf()
  • scanf()
  • putchar()
  • getchar()

Le langage C ne possède aucune instruction d'entrée/sortie mais s'appuie sur une bibliothèque de fonctions standard.

Les fonctions d'E/S

E/S de caractères avec getchar() et putchar()

  • getchar() renvoie un int, ce qui lui permet de renvoyer un caractères, sur 8 bits, en cas de succès ou -1 en cas d'échec.
  • putchar() prend en argument un int.

E/S de chaînes de caractères avec gets(), fgets() et puts()

  • gets() est une fonction à proscrire absolument (danger de buffer overflow). Cette fonction lit une ligne de l'entrée standard stdin et le copie dans le buffer passé en argument jusqu'à ce que \n ou EOF soit rencontré.
  • fgets() permet de limiter le nombre de caractères à lire et à copier dans le tableau passé en argument.
  • puts() écrit la chaîne passée en argument et rajoute \n à la fin.

E/S formatées avec printf() et scanf()

La fonction printf() accepte les formats suivants :

%spour un argument de type chaîne de caractères
%cpour un caractère
%dpour un entier
%epour un réel flottant, notation scientifique
%fpour un réel flottant, notation standard
%gpour un réel flottant, notation la mieux adaptée
%opour une conversion en octal
%ppour afficher un pointeur
%xpour une conversion en hexadécimal

Il existe des modificateurs de format :

%hdpour un short int
%ldpour un long int
%lfpour un double
%.3fun flottant avec 3 chiffres après la virgule
%20sune chaîne de 20 caractères
%[^\n]sune chaîne de caractères avec les espaces

Il est possible de définir une taille limite des données affichées.

La fonction scanf() fonctionne comme printf() mais effectue une lecture sur l'entrée standard. scanf() prend en argument les adresses des variables à affecter. Elle renvoie le nombre de champs correctement lus.

Contourner les pièges de scanf()

Attention, scanf() est une fonction qui pose beaucoup de problèmes et qu'il est fortement déconseiller d'utiliser telle quelle ! Parmis ces problèmes, il y a les risques de bouclage infini : quand scanf() essaye de convertir une chaine vers un nombre et que la conversion échoue, les caractères non numériques sont laissés dans le buffer. Pour fiabiliser la saisie avec scanf(), voici un modèle universel :

while(1){
    fgets(buf,sizemax,stdin);
    ret = sscanf(buf,"%c",&c);
    if(ret != 1)
        /* instructions à exécuter en cas d'erreur */
        if((strlen(buf) == sizemax-1) && (buf[sizemax-2] != '\n'))
            do 
                c=getchar(); 
            while (c!='\n');  
}

< Passer des arguments à un programme | TutoCFrench | Types de données composés et type dérivés >

print · rss · source
Page last modified on January 30, 2008, at 02:21 PM