Что такое идентификаторы формата scanf ("% * s") и scanf ("% * d")? - PullRequest
44 голосов
/ 28 января 2010

Каково практическое использование форматов "%*" в scanf ().Если этот формат существует, то за ним должна быть какая-то цель.Следующая программа выдает странный вывод.

#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;
}

Вывод:

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:~$

Ответы [ 5 ]

89 голосов
/ 28 января 2010

Для printf * позволяет вам указать минимальную ширину поля через дополнительный параметр, т.е. printf("%*d", 4, 100); задает ширину поля 4.

Для scanf, * указывает, что поле должно быть прочитано, но игнорируется, так что scanf("%*d %d", &i) для входа "12 34" будет игнорировать 12 и читать 34 в целое число i.

19 голосов
/ 28 января 2010

Звезда - это символ флага, который говорит, что следует игнорировать текст, прочитанный спецификацией. Чтобы узнать из документации glibc:

Необязательный символ флага `* ', который говорит, что нужно игнорировать текст, прочитанный для этой спецификации. Когда scanf находит спецификацию преобразования, которая использует этот флаг, он читает входные данные в соответствии с указаниями остальной части спецификации преобразования, но он отбрасывает эти входные данные, не использует аргумент указателя и не увеличивает число успешных назначений.

Это полезно в ситуациях, когда строка спецификации содержит более одного элемента, например: scanf("%d %*s %d", &i, &j) для "12 test 34" - где i & j - целые числа, а остальные вы хотите игнорировать.

6 голосов
/ 28 января 2010

См. здесь

Необязательная начальная звездочка означает, что данные должны извлекаться из стандартного ввода, но игнорироваться, т. Е. Они не сохраняются в соответствующем аргументе.

5 голосов
/ 28 января 2010

* используется для пропуска ввода, не помещая его в какую-либо переменную. Таким образом, scanf("%*d %d", &i); будет читать два целых числа и помещать второе в i.

Значение, которое было выведено в вашем коде, является просто значением, которое было в неинициализированной переменной i - вызов scanf не изменил его.

2 голосов
/ 23 сентября 2013

In scanf("%*d",&a) * пропускает ввод. Для чтения входных данных необходимо использовать дополнительные "%d" в scanf. Например:

 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

Если вы используете другой %d т.е.: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 тогда а = 10 б = 30 с = 40.

Если вы используете "," в scanf, то значение не будет приниматься после %*d т.е. scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O / P: a = 10 b = 2 c = 3 будет вывод.

...