Разбор строки с sscanf, в котором есть строка - PullRequest
1 голос
/ 11 января 2020

Проект находится в C. Мне нужно проанализировать строки, которые всегда форматируются следующим образом: целое число, пробел, знак плюс, строка из нескольких слов плюс знак, пробел, целое число, пробел, целое число, конец строки

Пример: 10 +This is 1 string+ 2 -1

Мне трудно понять, что вводить в форматирование sscanf, чтобы строка, окруженная символами «+», была правильно проанализирована, без учета символов «+». Предполагая, что sscanf может быть использован для этого случая.

Я пробовал "%d +%s+ %d %d", и это не сработало.

1 Ответ

2 голосов
/ 11 января 2020

Вы используете %s, но это читает до первого символа пробела. Вы хотите прочитать строку знаков «не плюс», так что, скажем, sscanf() должен делать:

"%d +%[^+]+ %d %d"

Это набор сканирования - см. POSIX sscanf(). Вы также должны защитить себя от переполнения буфера . Если у вас есть:

char buffer[256];

, используйте:

"%d +%255[^+]+ %d %d"

Обратите внимание на одно за другим в длину - это конструктивная особенность семейства функций scanf(). Вы можете пропустить начальные пробелы, поставив пробел после первого + в строке формата. Невозможно пропустить завершающие пробелы до второго + в данных; вам придется удалить их отдельно.

Вы просите «конец строки» после 3-го числа. Это довольно сложно. Вы можете использовать:

"%d +%255[^+]+ %d %d %n"

, передавая дополнительный указатель на аргумент int для хранения смещения последнего проанализированного символа. Пробел перед %n пропускает пробел, включая символы новой строки, поэтому, если вы прочитаете int nbytes; (пропуская &nbytes), то вы проверите if (buffer[nbytes] != '\0') { …handle trailing garbage… } (но только после проверки, что у вас есть четыре успешные спецификации преобразования - %n спецификации преобразования не учитываются в возвращаемом значении из sscanf() и др.). Есть и другие решения для этого; все они в какой-то степени грязные.

...