Создание fscanf Ignore Необязательный параметр
Вопрос
Я использую fscanf для чтения файла с такими строками, как
Число & Lt; -белое пространство - & Gt; строка < -пробел - > Необязательный_3-й столбец
Я хочу извлечь номер и строку из каждого столбца, но игнорирую 3-й столбец, если он существует
Пример данных:
12 фу что-то
03 бар
24 что-то #randomcomment
Я бы хотел извлечь 12, foo; 03, бар; 24, что-то игнорируя & Quot; что-то & Quot; и " #randomcomment "
У меня сейчас есть что-то вроде
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
Однако это не работает со строками без 3-го столбца. Как я могу заставить его игнорировать все после 2-й строки?
Решение
Мне кажется, что самое простое решение - это scanf ("% d% s " ;, & amp; num, & amp; word) и затем fgets () съесть остаток строки.
Другие советы
Проблема в том, что %*s
ест число на следующей строке, когда нет третьего столбца, а затем следующий %d
не выполняется, поскольку следующий токен не является числом. Чтобы исправить это, не используя gets()
и sscanf()
, вы можете использовать указанный класс символов:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
[^\n]
говорит, что должно соответствовать как можно большему числу символов, которые не являются символами новой строки, а *
подавляет назначение, как и раньше. Также обратите внимание, что вы не можете поместить пробел между %s
и %*[\n]
, потому что в противном случае этот пробел в строке формата будет совпадать с новой строкой, в результате чего <=> будет соответствовать всей последующей строке, а это не то, что ты хочешь.
Используйте fgets () для одновременного чтения строки, а затем используйте sscanf () для поиска двух интересующих вас столбцов, более надежного, и вам не нужно делать ничего особенного, чтобы игнорировать конечные данные. р>
Я часто использую get (), за которым следует sscanf () в строке, которую вы только что запустили.
Бонус: вы можете отделить тест для конца ввода от анализа.