Il s'agit des fonctions de la librairie standard stdio.h utilisées avec les unités classiques d'entrées-sorties, qui sont respectivement le clavier et l'écran. Sur certains compilateurs, l'appel à la librairie stdio.h par la directive au préprocesseur

#include <stdio.h>

n'est pas nécessaire pour utiliser printf et scanf.

1.  La fonction d'écriture printf

La fonction printf est une fonction d'impression formatée, ce qui signifie que les données sont converties selon le format particulier choisi. Sa syntaxe est

printf("chaîne de contrôle ",expression-1, ..., expression-n);

La chaîne de contrôle contient le texte à afficher et les spécifications de format correspondant à chaque expression de la liste. Les spécifications de format ont pour but d'annoncer le format des données à visualiser. Elles sont introduites par le caractère %, suivi d'un caractère désignant le format d'impression. Les formats d'impression en C sont donnés ci-dessous.

En plus du caractère donnant le type des données, on peut éventuellemnt préciser certains paramètres du format d'impression, qui sont spécifiés entre le % et le caractère de conversion dans l'ordre suivant :

  • largeur minimale du champ d'impression : %10d spécifie qu'au moins 10 caractères seront réservés pour imprimer l'entier. Par défaut, la donnée sera cadrée à droite du champ. Le signe - avant le format signifie que la donnée sera cadrée à gauche du champ (%-10d).
  • précision : %.12f signifie qu'un flottant sera imprimé avec 12 chiffres après la virgule. De même %10.2f signifie que l'on réserve 12 caractères (incluant le caractère .) pour imprimer le flottant et que 2 d'entre eux sont destinés aux chiffres après la virgule. Lorsque la précision n'est pas spécifiée, elle correspond par défaut à 6 chiffres après la virgule. Pour une chaîne de caractères, la précision correspond au nombre de caractères imprimés : %30.4s signifie que l'on réserve un champ de 30 caractères pour imprimer la chaîne mais que seulement les 4 premiers caractères seront imprimés (suivis de 26 blancs).

format conversion en écriture
%d int décimale signée
%ld long int décimale signée
%u unsigned int décimale non signée
%lu unsigned long int décimale non signée
%o unsigned int octale non signée
%lo unsigned long int octale non signée
%x unsigned int hexadécimale non signée
%lx unsigned long int hexadécimale non signée
%f double décimale virgule fixe
%lf long double décimale virgule fixe
%e double décimale notation exponentielle
%le long double décimale notation exponentielle
%g double décimale, représentation la plus courte parmi %f et %e
%lg long double décimale, représentation la plus courte parmi %lf et %le
%c unsigned char caractère
%s char* chaîne de caractères
 

Formats d'impression pour la fonction printf


Exemple :

#include <stdio.h>
main()
{
  int i = 23674;
  int j = -23674;
  long int k = (1l << 32);
  double x = 1e-8 + 1000;
  char c = 'A';
  char *chaine = "chaine de caracteres";

  printf("impression de i: \n");
  printf("%d \t %u \t %o \t %x",i,i,i,i);
  printf("\nimpression de j: \n");
  printf("%d \t %u \t %o \t %x",j,j,j,j);
  printf("\nimpression de k: \n");
  printf("%d \t  %o \t %x",k,k,k);
  printf("\n%ld \t %lu \t %lo \t %lx",k,k,k,k); 
  printf("\nimpression de x: \n");
  printf("%f \t %e \t %g",x,x,x);
  printf("\n%.2f \t %.2e",x,x);
  printf("\n%.20f \t %.20e",x,x);
  printf("\nimpression de c: \n");
  printf("%c \t %d",c,c);
  printf("\nimpression de chaine: \n");
  printf("%s \t %.10s",chaine,chaine);
  printf("\n");
}

Ce programme imprime à l'écran :

impression de i: 
23674    23674           56172   5c7a
impression de j: 
-23674   4294943622      37777721606     ffffa386
impression de k: 
0         0      0
4294967296       4294967296      40000000000     100000000
impression de x: 
1000.000000      1.000000e+03    1000
1000.00          1.00e+03
1000.00000001000000000000        1.00000000001000000000e+03
impression de c: 
A        65
impression de chaine: 
chaine de caracteres     chaine de 

2.  La fonction de saisie scanf

La fonction scanf permet de saisir des données au clavier et de les stocker aux adresses spécifiées par les arguments de la fonctions.

scanf("chaîne de contrôle",argument-1,...,argument-n)

La chaîne de contrôle indique le format dans lequel les données lues sont converties. Elle ne contient pas d'autres caractères (notamment pas de \n). Comme pour printf, les conversions de format sont spécifiées par un caractère précédé du signe %. Les formats valides pour la fonction scanf diffèrent légèrement de ceux de la fonction printf.

Les données à entrer au clavier doivent être séparées par des blancs ou des <RETURN> sauf s'il s'agit de caractères. On peut toutefois fixer le nombre de caractères de la donnée à lire. Par exemple %3s pour une chaîne de 3 caractères, %10d pour un entier qui s'étend sur 10 chiffres, signe inclus.

Exemple :

#include <stdio.h>
main()
{
  int i;
  printf("entrez un entier sous forme hexadecimale i = ");
  scanf("%x",&i);
  printf("i = %d\n",i);
}

Si on entre au clavier la valeur 1a, le programme affiche i = 26.
 


format type d'objet pointé représentation de la donnée saisie
%d int décimale signée
%hd short int décimale signée
%ld long int décimale signée
%u unsigned int décimale non signée
%hu unsigned short int décimale non signée
%lu unsigned long int décimale non signée
%o int octale
%ho short int octale
%lo long int octale
%x int hexadécimale
%hx short int hexadécimale
%lx long int hexadécimale
%f float flottante virgule fixe
%lf double flottante virgule fixe
%Lf long double flottante virgule fixe
%e float flottante notation exponentielle
%le double flottante notation exponentielle
%Le long double flottante notation exponentielle
%g float flottante virgule fixe ou notation exponentielle
%lg double flottante virgule fixe ou notation exponentielle
%Lg long double flottante virgule fixe ou notation exponentielle
%c char caractère
%s char* chaîne de caractères
 

Formats de saisie pour la fonction scanf


3.  Impression et lecture de caractères

Les fonctions getchar et putchar permettent respectivement de lire et d'imprimer des caractères. Il s'agit de fonctions d'entrées-sorties non formatées. 

La fonction getchar retourne un int correspondant au caractère lu. Pour mettre le caractère lu dans une variable caractere, on écrit

caractere = getchar();

Lorsqu'elle détecte la fin de fichier, elle retourne l'entier EOF (End Of File), valeur définie dans la librairie stdio.h. En général, la constante EOF vaut -1. 

La fonction putchar écrit caractere sur la sortie standard :

putchar(caractere);

Elle retourne un int correspondant à l'entier lu ou à la constante EOF en cas d'erreur.

Par exemple, le programme suivant lit un fichier et le recopie caractère par caractère à l'écran.

#include <stdio.h>
main()
{
  char c;
  
  while ((c = getchar()) != EOF)
    putchar(c);
}

Notons que l'expression (c = getchar()) dans le programme précédent a pour valeur la valeur de l'expression getchar() qui est de type int. Le test (c = getchar()) != EOF compare donc bien deux objets de type int (signés).

Ce n'est par contre pas le cas dans le programme suivant :

#include <stdio.h>
main()
{
  char c;
  do
    {
      c = getchar();
      if (c != EOF)
        putchar(c);
    }
  while (c != EOF);
}

Ici, le test c != EOF compare un objet de type char et la constante EOF qui vaut -1. Si le type char est non signé par défaut, cette condition est donc toujours vérifiée. Si le type char est signé, alors le caractère de code 255, y, sera converti en l'entier -1. La rencontre du caractère y sera donc interprétée comme une fin de fichier. Il est donc recommandé de déclarer de type int (et non char) une variable destinée à recevoir un caractère lu par getchar afin de permettre la détection de fin de fichier.
 


2017-10-15 15:58:27 / mazoughou@magoe.gn

0 commentaires

Votre impression compte aussi