web-dev-qa-db-fra.com

Que sont les identificateurs de format scanf ("% * s") et scanf ("% * d")?

Quelle est l'utilisation pratique des formats "%*" dans scanf (). Si ce format existe, il doit y avoir un objectif derrière lui. Le programme suivant donne une sortie étrange.

#include<stdio.h>
int main()
{
        int i;
        char str[1024];

        printf("Enter text: ");
        scanf("%*s", &str);
        printf("%s\n", str);

        printf("Enter interger: ");
        scanf("%*d", &i);
        printf("%d\n", i);
        return 0;
}

Production:

manav@workstation:~$ gcc -Wall -pedantic d.c
d.c: In function ‘main’:
d.c:8: warning: too many arguments for format
d.c:12: warning: too many arguments for format
manav@manav-workstation:~$ ./a.out
Enter text: manav
D
Enter interger: 12345
372
manav@workstation:~$
44
manav m-n

Pour printf, le * vous permet de spécifier la largeur minimale du champ via un paramètre supplémentaire, c'est-à-dire que printf("%*d", 4, 100); spécifie une largeur de champ de 4.

Pour scanf, le * indique que le champ doit être lu mais ignoré, de sorte que c'est-à-dire scanf("%*d %d", &i) pour l'entrée "12 34" ignorera 12 et lira 34 dans l'entier i.

89
Håvard S

L'étoile est un caractère indicateur, qui dit d'ignorer le texte lu par la spécification. Pour quitter la documentation de la glibc:

Un caractère indicateur facultatif `* ', qui indique d'ignorer le texte lu pour cette spécification. Lorsque scanf trouve une spécification de conversion qui utilise cet indicateur, il lit l'entrée comme indiqué par le reste de la spécification de conversion, mais il ignore cette entrée, n'utilise pas d'argument de pointeur et n'incrémente pas le nombre d'affectations réussies.

Il est utile dans les situations où la chaîne de spécification contient plusieurs éléments, par exemple: scanf("%d %*s %d", &i, &j) pour le "12 test 34" - où i & j sont des entiers et vous souhaitez ignorer le reste.

19
zacsek

Voir ici

Un astérisque de départ facultatif indique que les données doivent être extraites de stdin mais ignorées, c'est-à-dire qu'elles ne sont pas stockées dans l'argument correspondant.

6
Jon Cage

Le * Est utilisé pour ignorer une entrée sans la placer dans une variable. Ainsi, scanf("%*d %d", &i); lit deux entiers et place le second dans i.

La valeur qui a été sortie dans votre code est juste la valeur qui était dans la variable i non initialisée - l'appel scanf ne l'a pas modifiée.

5
interjay

Dans scanf("%*d",&a)* Ignore l'entrée. Pour lire les entrées, il faut utiliser un "%d" Supplémentaire dans scanf. Par exemple:

 int a=1,b=2,c=3;
    scanf("%d %*d %d",&a,&b,&c); //input is given as: 10 20 30

O/p:

a=10 b=30 and c=3;  // 20 is skipped

Si vous utilisez un autre %d C'est-à-dire: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 alors a = 10 b = 30 c = 40.

Si vous utilisez "," Dans scanf, aucune valeur ne sera prise après %*d C'est-à-dire; scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O/p: a = 10 b = 2 c = 3 sera la sortie.

2
Raunak Chowdhury