Оригинальная версия вопроса указана только "%s"
в формате;он был обновлен и теперь запрашивает "%s %d"
в качестве формата записи.
Странное требование во многих отношениях.Вы можете использовать подавление присваивания, но будьте осторожны, так как это ограничивает вашу проверку ошибок.Обратите внимание, что спецификация преобразования %s
читает слова, разделенные пробелами - вероятно, именно это вы подразумеваете под «записями», поскольку именно эту функцию и формат вы используете.
size_t count = 0;
while (fscanf(in, "%*s") == 0)
count++;
printf("There are %zu words in the input\n", count);
Вы можете использовать фиксированныйХраните так:
int offset = 0;
size_t count = 0;
while (fscanf(in, "%*s%n", &offset) == 0 && offset != 0)
{
count++;
offset = 0;
}
Страница справочника scanf()
обеспечивает тщательное чтение, повторное чтение и повторное чтение.
Та же основная идея подавления присваивания применяется к формату записи "%s %d"
.Проблема в том, что подавленные преобразования не учитываются в возвращаемом значении от fscanf()
- и спецификации преобразования %n
также не учитываются.Таким образом, вы можете использовать:
int offset = 0;
size_t count = 0;
while (fscanf(in, "%*s %*d%n", &offset) == 0 && offset != 0)
{
count++;
offset = 0;
}
, что является лишь тривиальной модификацией того, что было раньше.Если преобразование %*s
или %*d
завершится неудачно, %n
не будет выполнено, поэтому offset
не изменится.Если оба успешны, тогда offset
будет присвоено значение больше нуля (потому что строка должна содержать не менее одного символа, а число должно содержать не менее одного символа, и между строкой ичисло).Итак, показанный код определяет, было ли чтение успешным.