Формат строки в C% *s
Я где-то видел часть кода на C
char name[51];
int group = 0;
scanf("%*s %50s %*s %d", name, &group);
printf("%s / %d\n", name, group);
Если мы введем
"Имя: Группа Смита:7"
он ждет, когда мы представим другие ценности. Странно. Что именно происходит и что делает%*s %50s %*s
жадный. Я видел%*s
до, но никогда не ставьте до и после чтения строки.
1 ответ
В *
после %
и перед спецификатором преобразования стоит флаг подавления присвоения. Он указывает, что соответствующая запись не будет сохранена (т.е. будет отброшена), и соответствующий аргумент хранения не требуется.
Цитирование C11
, глава §7.21.6.2
[...] Если запрещение присвоения не было указано
*
, результат преобразования помещается в объект, на который указывает первый аргумент, следующий за аргументом формата, который еще не получил результат преобразования.
Тем не менее, для ввода
Name:Smith Group:7
то, что вы ожидаете, это что-то вроде
%*s
совпадает с "Name:" и отбрасывает%50s
спички "Смит" и магазины%*s
совпадает с "Group:" и сбрасывает%d
совпадения7
и магазины.
Однако есть проблема. Для спецификатора преобразованияs
,
Соответствует последовательности символов, отличных от пробелов
Это означает, что он будет сканировать и сопоставлять до пробела, а поскольку пробелов нет до "Group", все "Name:Smith" будет использовано первым %*s
директива. То же самое происходит со следующими%*s
, также. Таким образом, спецификация преобразования не завершается, иscanf()
ожидает использования следующего ввода.
Итак, чтобы соответствовать спецификации преобразования, введите входные данные как
Name: Smith Group: 7
^^ ^^