Description de la fonction Scanf C
Description de la fonction Scanf C

Vidéo: Description de la fonction Scanf C

Vidéo: Description de la fonction Scanf C
Vidéo: 3 IDÉES DE BUSINESS À FAIRE AVEC 0€ (vraiment zéro euro) 2024, Novembre
Anonim

Dans cet article, la fonction scanf() est considérée sous une forme générale sans référence à une norme spécifique, donc les données de toutes les normes C99, C11, C++11, C++14 sont incluses ici. Peut-être que, dans certaines normes, la fonction fonctionne avec des différences par rapport au matériel présenté dans l'article.

fonction scanf C - description

scanf() est une fonction située dans les fichiers d'en-tête stdio.h(C) et cstdio(C++), également appelée entrée de programme formatée. scanf lit les caractères du flux d'entrée standard (stdin) et les convertit en fonction du format, puis les écrit dans les variables spécifiées. Format - signifie que les données sont converties dans une certaine forme à la réception. Ainsi, la fonction scanf C est décrite:

scanf("%format", &variable1[, &variable2, […]), où les variables sont passées en tant qu'adresses. La raison de cette façon de passer des variables à une fonction est évidente: à la suite d'un travail, elle renvoie une valeur indiquant la présence d'erreurs, doncle seul moyen de changer les valeurs des variables est de passer par adresse. De plus, grâce à cette méthode, la fonction peut traiter des données de tout type.

Certains programmeurs se réfèrent à des fonctions comme scanf() ou printf() comme des procédures à cause de l'analogie avec d'autres langages.

Scanf permet la saisie de tous les types de langage de base: char, int, float, string, etc. Dans le cas de variables de type chaîne, il n'est pas nécessaire de spécifier le signe d'adresse - "&", car la variable de type chaîne est un tableau et son nom est l'adresse du premier élément du tableau dans la mémoire de l'ordinateur.

Utilisation de C en C++
Utilisation de C en C++

Format de saisie de données ou chaîne de contrôle

Commencez par regarder l'exemple de la fonction scanf C de la description.


include int main() { int x; tandis que (scanf("%d", &x)==1) printf("%d\n", x); renvoie 0; //exigence pour les systèmes Linux }

Le format d'entrée se compose des quatre paramètres suivants: %[width][modifiers] type. Dans ce cas, le signe "%" et le type sont des paramètres obligatoires. C'est-à-dire que le format minimum ressemble à ceci: "%s", "%d" et ainsi de suite.

En général, les caractères qui composent la chaîne de format sont divisés en:

  • spécificateurs de format - tout ce qui commence par %;
  • caractères de séparation ou d'espace - ce sont des espaces, des tabulations(t), des retours à la ligne (n);
  • caractères autres que les espaces.

La fonction n'est peut-être pas sûre.

Utilisez scanf_s() au lieu de scanf().

(message de Visual Studio)

Type, ou spécificateurs de format, ou caractères de conversion, ou caractères de contrôle

code binaire
code binaire

Une déclaration scanf C doit contenir au moins un spécificateur de format, qui est spécifié à la fin des expressions commençant par "%". Il indique au programme le type de données à attendre lors de la saisie, généralement à partir du clavier. Liste de tous les spécificateurs de format dans le tableau ci-dessous.

Type Signification
1 %c Le programme attend la saisie d'un caractère. La variable à écrire doit être du type caractère char.
2 %d Le programme attend la saisie d'un nombre décimal de type entier. La variable doit être de type int.
3 %i Le programme attend la saisie d'un nombre décimal de type entier. La variable doit être de type int.
4 %e, %E Le programme s'attend à entrer un nombre à virgule flottante (virgule) sous forme exponentielle. La variable doit être de type float.
5 %f Le programme attend un nombre à virgule flottante (virgule). La variable doit être de type float.
6 %g, %G Le programme attend un nombre à virgule flottante (virgule). La variable doit être de type float.
7 %a Le programme attend un nombre à virgule flottante (virgule). La variable doit être de type float.
8 %o Le programme attend un nombre octal. La variable doit être de type int.
9 %s Le programme attend qu'une chaîne soit saisie. Une chaîne est un ensemble de caractères quelconques jusqu'au premier caractère de séparation rencontré. La variable doit être de type string.
10 %x, %X Le programme attend un nombre hexadécimal. La variable doit être de type int.
11 %p

La variable attend une entrée de pointeur. La variable doit être de type pointeur.

12 %n Écrit dans une variable une valeur entière égale au nombre de caractères lus jusqu'ici par la fonction scanf.
13 %u Le programme lit un entier non signé. Le type de variable doit être un entier non signé.
14 %b Le programme attend un nombre binaire. La variable doit être de type int.
15 % Jeu de caractères numérisé. Le programme attend que des caractères soient saisis.du pool limité spécifié entre crochets. scanf fonctionnera tant qu'il y aura des caractères du jeu spécifié sur le flux d'entrée.
16 %% Signe "%".

Caractères dans la chaîne de format

Code C++
Code C++

Symbole étoile ()

L'astérisque () est un indicateur indiquant que l'opération d'affectation doit être supprimée. Un astérisque est placé immédiatement après le signe "%". Par exemple,


scanf("%d%c%d", &x, &y); //ignore le caractère entre deux entiers. scanf("%s%d%s", str, str2); // ignore l'entier entre deux chaînes.

C'est-à-dire que si vous entrez la ligne "45-20" dans la console, le programme fera ce qui suit:

  1. La variable "x" recevra la valeur 45.
  2. La variable "y" se verra attribuer la valeur 20.
  3. Et le signe moins (tiret) "-" sera ignoré grâce à "%c".

Largeur (ou largeur de champ)

Il s'agit d'un entier entre le signe "%" et le spécificateur de format qui spécifie le nombre maximum de caractères à lire dans l'opération de lecture en cours.


scanf("%20s", str); // lit les 20 premiers caractères du flux d'entrée

Il y a quelques points importants à garder à l'esprit:

  1. scanf se terminera s'il rencontre un caractère séparateur, même s'il ne compte pas 20 caractères.
  2. Si plus de 20 caractères sont entrés, seuls les 20 premiers caractères seront écrits dans str.

Modificateurstype (ou précision)

code d'éclaboussure
code d'éclaboussure

Ce sont des drapeaux spéciaux qui modifient le type de données attendues en entrée. Le drapeau est spécifié à gauche du spécificateur de type:

  • L ou l (petit L) Lorsque "l" est utilisé avec les spécificateurs d, i, o, u, x, le drapeau indique au programme qu'une entrée longue int est attendue. Lors de l'utilisation de "l" avec le spécificateur e ou f, le drapeau indique au programme qu'il doit s'attendre à une valeur double. L'utilisation de "L" indique au programme qu'un long double est attendu. L'utilisation de "l" avec les spécificateurs "c" et "s" indique au programme que des caractères à deux octets comme wchar_t sont attendus. Par exemple, "%lc", "%ls", "%l[asd]".
  • h est un drapeau indiquant le type court.
  • hh - indique que la variable est un pointeur vers une valeur de caractère signé ou non signé. Le drapeau peut être utilisé avec les spécificateurs d, i, o, u, x, n.
  • ll (deux petits L) - indique que la variable est un pointeur vers une valeur de type entier long long signé ou entier long long non signé. Le drapeau est utilisé avec les spécificateurs: d, i, o, u, x, n.
  • j - indique que la variable est un pointeur vers le type intmax_t ou uintmax_t du fichier d'en-tête stdint.h. Utilisé avec les spécificateurs: d, i, o, u, x, n.
  • z - indique que la variable est un pointeur vers le type size_t, dont la définition se trouve dans stddef.h. Utilisé avec les spécificateurs: d, i, o, u, x, n.
  • t - indique que la variable est un pointeur vers le type ptrdiff_t. Définition surce type est dans stddef.h. Utilisé avec les spécificateurs: d, i, o, u, x, n.

Plus clairement, l'image avec modificateurs peut être représentée sous forme de tableau. Une telle description de scanf C pour les programmeurs sera plus claire.

Spécificateurs de type et modificateurs
Spécificateurs de type et modificateurs

Autres caractères

Tous les caractères rencontrés dans le format seront ignorés. Dans le même temps, il convient de noter que la présence d'espaces blancs ou de caractères séparateurs (nouvelle ligne, espace, tabulation) dans la chaîne de contrôle peut entraîner un comportement différent de la fonction. Dans une version, scanf() lira sans enregistrer aucun nombre de séparateurs jusqu'à ce qu'il rencontre un caractère autre que le séparateur, et dans une autre version, les espaces (eux seuls) ne jouent aucun rôle et l'expression "%d + %d" est équivalent à "% d+%d".

Exemple de code C++
Exemple de code C++

Exemples

Regardons quelques exemples pour vous aider à réfléchir et à mieux comprendre le fonctionnement de la fonction.


scanf("%3s", str); //si vous entrez la chaîne "1d2s3d1;3" dans la console, seul "1d2" sera écrit dans str scanf("%dminus%d", &x, &y); //les caractères moins entre deux nombres seront ignorés scanf("%5[0-9]", str); // les caractères seront saisis dans str jusqu'à ce qu'il y ait 5 caractères et que les caractères soient des nombres de 0 à 9. scanf("%lf", &d); //attend une double entrée scanf("%hd", &x); //nombre attendu de type short scanf("%hu", &y); // attend un nombre non signé short scanf("lx", &z); //nombre attendu de type entier long

DepuisLes exemples ci-dessous montrent comment le nombre attendu change en utilisant différents symboles.

scanf C - description pour les débutants

Cette section sera utile pour les débutants. Souvent, vous devez avoir à portée de main non pas tant une description complète de scanf C que les détails du fonctionnement de la fonction.

  • Cette fonctionnalité est quelque peu obsolète. Il existe plusieurs implémentations différentes dans des bibliothèques de différentes versions. Par exemple, la fonction scanf S C améliorée, dont une description peut être trouvée sur le site Web de Microsoft.
  • Le nombre de spécificateurs dans le format doit correspondre au nombre d'arguments passés à la fonction.
  • Les éléments du flux d'entrée doivent être séparés uniquement par des caractères de séparation: espace, tabulation, nouvelle ligne. Virgule, point-virgule, point, etc. - ces caractères ne sont pas des séparateurs pour la fonction scanf().
  • Si scanf rencontre un caractère de séparation, la saisie sera arrêtée. S'il y a plus d'une variable à lire, alors scanf passera à la lecture de la variable suivante.
  • La moindre incohérence dans le format des données d'entrée conduit à des résultats imprévisibles du programme. Eh bien, si le programme se termine simplement par une erreur. Mais souvent, le programme continue de fonctionner et le fait mal.
  • scanf("%20s …", …); Si le flux d'entrée dépasse 20 caractères, alors scanf lira les 20 premiers caractères et abandonnera ou passera à la lecture de la variable suivante, si elle est spécifiée. Dans ce cas, le prochain appel à scanf continuera à lire le flux d'entrée à partir du point où le travail de l'appel précédent à scanf s'est arrêté. Si lors de la lecture des 20 premierscaractères, un caractère délimiteur est rencontré, scanf abandonnera ou continuera à lire la variable suivante, même s'il n'a pas lu 20 caractères pour la première variable. Dans ce cas, tous les caractères non lus seront attachés à la variable suivante.
  • Si le jeu de caractères scannés commence par un "^", alors scanf lira les données jusqu'à ce qu'il rencontre un caractère délimiteur ou un caractère du jeu. Par exemple, "%[^A-E1-5]" lira les données du flux jusqu'à ce que l'un des caractères anglais majuscules de A à E ou l'un des nombres de 1 à 5 soit rencontré.
  • La fonction scanf C, telle que décrite, renvoie un nombre égal au nombre d'écritures réussies dans les variables. Si scanf écrit 3 variables, alors le résultat de réussite de la fonction renverra le nombre 3. Si scanf ne peut pas écrire de variables, alors le résultat sera 0. Et, enfin, si scanf ne peut pas démarrer du tout pour une raison quelconque, le le résultat sera EOF.
  • Si la fonction scanf() s'est mal terminée. Par exemple, scanf("%d", &x) - un nombre était attendu, mais des caractères ont été reçus en entrée. Le prochain appel scanf() commencera au point du flux d'entrée où l'appel de fonction précédent s'est terminé. Pour surmonter ce problème, il est nécessaire de se débarrasser des personnages problématiques. Cela peut être fait, par exemple, en appelant scanf("%s"). Autrement dit, la fonction lira une chaîne de caractères et la supprimera. De cette manière délicate, vous pouvez continuer à saisir les données nécessaires.
  • Dans certaines implémentations de scanf(), "-" n'est pas autorisé dans le jeu de caractères scanné.
  • Le spécificateur "%c" lit chaque caractère du flux. C'est-à-dire qu'il lit également le caractère de séparation. Pour ignorer le caractère délimiteur et continuer à lire le caractère souhaité, vous pouvez utiliser "%1s".
  • Lorsque vous utilisez le spécificateur "c", il est permis d'utiliser la largeur "%10c", mais alors un tableau d'éléments de type char doit être passé comme variable à la fonction scanf.
  • "%[a-z]" signifie "toutes les lettres minuscules de l'alphabet anglais", et "%[z-a]" signifie seulement 3 caractères: 'z', 'a', '-'. En d'autres termes, le caractère "-" signifie une plage uniquement s'il se trouve entre deux caractères qui sont dans le bon ordre. Si "-" est à la fin d'une expression, au début ou dans le mauvais ordre des caractères de chaque côté, il s'agit simplement d'un trait d'union, pas d'une plage.
Code C++
Code C++

Conclusion

Ceci conclut la description de scanf C. C'est une fonctionnalité très pratique pour travailler dans de petits programmes et lors de l'utilisation de la méthode de programmation procédurale. Cependant, le principal inconvénient est le nombre d'erreurs imprévisibles qui peuvent survenir lors de l'utilisation de scanf. Par conséquent, la description de scanf C lors de la programmation est mieux gardée devant vos yeux. Dans les grands projets professionnels, les iostreams sont utilisés, car ils ont des capacités de niveau supérieur, ils sont mieux à même de détecter et de gérer les erreurs, et de travailler également avec des quantités importantes d'informations. Il convient également de noter que la description de scanf C en russe est disponible sur de nombreuses sources réseau, ainsi que des exemples de celui-ciutilisation, en raison de l'ancienneté de la fonction. Par conséquent, si nécessaire, vous pouvez toujours trouver la réponse sur les forums thématiques.

Conseillé: