Subtilités du scanf()

Signaler
Messages postés
165
Date d'inscription
mercredi 29 janvier 2003
Statut
Membre
Dernière intervention
15 avril 2010
-
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
Bonjour, malgré les recherches que j'ai fait sur scanf, j'ai du mal à comprendre comment il fonctionne exactement : comment reconnaît-il la fin du message tapé ?
Je m'explique :

Soit char chaine[64].
Je fais un scanf("%s", chaine).

Voici ce que je pense à l'heure actuelle :

- Taper "entrée" indique la fin du scanf si du texte a été tapé avant ce "entrée".
Le scanf donnera ce texte tapé avant "entrée". Le "entrée" est reporté après le scanf (un getchar() effectué juste après le scanf donnera un '\n').
- Si aucun texte n'est tapé avant "entrée", le "entrée" n'est pas pris en compte (ce n'est ni reconnu comme la fin du scanf, ni comme un caractère qu'il enregistrera).

Est-ce correct ? Quelqu'un peut-il m'éclairer davantage ?
Merci.

1 réponse

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Lorsque tu utilises scanf avec une chaîne de caractère voici le comportement, avec cet exemple:
#include <stdio.h>

int main(void)
{
  char s[20];

  scanf("%s", s);
  printf("%s\n", s);

  return 0;
}


Tout ce qui est après un caractères d'espacement est ignoré.
Scanf lis tout ce qu'il peut jusqu'à atteindre \n, \n\r ou EOF (CTRL + D sous Unix) après un caractère d'espacement ou EOF + EOF.

Le scanf donnera ce texte tapé avant "entrée". Le "entrée" est reporté après le scanf (un getchar() effectué juste après le scanf donnera un '\n').


Oui.


Si aucun texte n'est tapé avant "entrée", le "entrée" n'est pas pris en compte (ce n'est ni reconnu comme la fin du scanf, ni comme un caractère qu'il enregistrera).

Plus précisement, tant que tu tapes uniquement des caractères d'espacement, rien n'est pris en compte. (Par exemple, espace + espace + entree, ne fait rien).

Si tu t'y intéresse vraiment, tu peux en lire le code source:

http://www.google.fr/codesearch/p?hl=fr&sa=N&cd=1&ct=rc#XAzRy8oK4zA/libc/stdio/scanf.c&q=scanf

Et surtout:

http://www.google.fr/codesearch/p?hl=fr&sa=N&cd=1&ct=rc#XAzRy8oK4zA/libc/stdio/vfscanf.c&q=scanf