Подтвердить что ты не робот

Что такое идентификаторы формата scanf ("% * s") и scanf ("% * d")?

Каково практическое использование форматов "%*" в 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;
}

Вывод:

[email protected]:~$ 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
[email protected]:~$ ./a.out
Enter text: manav
D
Enter interger: 12345
372
[email protected]:~$
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Смотрите здесь

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

Ответ 4

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

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

Ответ 5

В 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

О/р

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

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

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