Как совместить тип форматирования snprintf и scanf?

Как можно совместить snprintf(format,"%%%zus", count); с таким типом форматирования: fscanf(stdin, "%*[^\"]%*c%[^\"]", name) ? (считывать от кавычек до кавычек)


Ответы (1 шт):

Автор решения: EOF

Для чтения всего, что находится между кавычек, нужно вызвать scanf так:

char str[64];
scanf("%*[^\"]\"%[^\"]%*[^\n]", str);

Давайте разберём этот пример.
Часть %*[^\"] заставляет scanf пропустить всё до первого символа ". Но оставляет его в очереди. Дальше \" заставит функцию пропустить оставшийся символ ". Потом, с помощью %[^\"] функция читает всё, до следующего символа " и сохраняет это в str. Ну и наспоследок, %*[^\n] пропустит всё, что осталось. ВАЖНО! Оставит символ \n во входной очереди. Например, при вводе строки I am a "test string" for this programm. в str будет записоно test string.
Для указания необходимого количества символов для чтения будем использовать snprintf. Что бы создать необходимый формат, нужно вызвать её так:

char fmt[32];
snprintf(fmt, sizeof fmt, "%%*[^\"]\"%%%d[^\"]%%*[^\n]", count);

где count- это необходимое количество символов для чтения. После этого, в fmt будет находиться строка, которую можно передать scanf. Вызов будет таким:

scanf(fmt, str);
→ Ссылка