Mis à part le cas d'une mauvaise saisie, il faut chercher un peu.
Comme cette méthode élimine les caractères <blanc> en attente en tête du buffer, on peut se tourner vers le cas où la donnée à lire peut posséder des caractères <blanc> en tête.
Par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int main(void)
{
int a;
char c;
scanf("%d",&a);
scanf(" %c",&c);
switch(c)
{
case ' ' : printf("Un blanc");
// ....
break;
case '\n' : printf("Un return");
// ....
break;
//....
default : printf("Autre chose");
// ....
}
return 0;
} |
On n'aura jamais "Un blanc" ou "Un return". En l'absence du (des) blanc qui précède %c (ou qui suit %d) le comportement dépend de la manière dont on entre les données (sur une ligne ou sur deux)
Autre exemple:
Soit à lire une ligne comportant un entier et une autre comportant une chaine de caractères pouvant posséder des <blanc> en début :
ligne 1 : "1234\n" A récupérer 1234
ligne 2 : " AB CDE:\n" A récupérer " AB CDE"
Le code suivant
1 2
| scanf("%d",&a);
scanf("%[^:]",tab); |
donnera pour tab "\n AB CDE"
Le code suivant
1 2 3 4 5 6 7 8
| scanf("%d",&a);
scanf(" %[^:]",tab);
//ou
// scanf("%d ",&a);
// scanf("%[^:]",tab);
//ou
// scanf("%d ",&a);
// scanf(" %[^:]",tab); |
donnera pour tab "AB CDE"
Donc, cette méthode marche très souvent, mais on peut trouver des cas où elle est en échec : si on doit lire des caractères <blanc>
Partager