Формат строки в 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
     ^^           ^^
Другие вопросы по тегам