Создание fscanf Ignore Необязательный параметр

StackOverflow https://stackoverflow.com/questions/245802

  •  05-07-2019
  •  | 
  •  

Вопрос

Я использую 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 () в строке, которую вы только что запустили.

Бонус: вы можете отделить тест для конца ввода от анализа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top