Что такое 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;
}

Вывод:

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
задан jww 7 December 2018 в 01:54
поделиться

4 ответа

Для printf The * позволяет указывать минимальную ширину поля через дополнительный параметр, например. PrintF («% * D», 4, 100); Определяет ширину поля 4. Ширина поля 4 означает, что если число занимает меньше 4 символов, чтобы напечатать, символы пространства напечатаны до Ширина поля заполнена. Если число требует больше места, чем указанное поле ширины поля, число печатается как - без усечения.

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

91
ответ дан 26 November 2019 в 21:46
поделиться

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

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

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

19
ответ дан 26 November 2019 в 21:46
поделиться

См. Здесь

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

6
ответ дан 26 November 2019 в 21:46
поделиться

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

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

5
ответ дан 26 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: