Заставить sscanf вернуть больше удовлетворенных аргументов

Моя группа проверки программного обеспечения тестирует фрагмент кода, подобный следующему:

unsigned int alarm_id;
char         alarm_text[16];
static const char text_string[] = "105, Water_Boiling";
signed int   arguments_satisfied =
sscanf(text_string,
"%3d, %16s",
&alarm_id, &alarm_text[0]);
if (arguments_satisfied < 2)
{
system_failure();
}

Используя фрагмент кода выше, есть ли способ получить sscanf вернуть значение больше 2 без изменения спецификатора формата или изменения аргументов на sscanf?

Они осуществляют if Выражение оператора, используя инструмент модульного тестирования.

Для C ++, есть ли различия с приведенным выше фрагментом при компиляции в C ++?
(Мы планируем использовать тот же код, но компилировать как C ++.)

К вашему сведению, мы используем процессор ARM7 с IAR Embedded Workbench.

0

Решение

sscanf возвращает количество преобразованных аргументов. Он не может преобразовать больше аргументов, чем вы сказали. Поэтому, если строка формата не изменена, sscanf не может вернуть значение больше 2. Одно возможное исключение — возможно, что EOF может быть возвращен, если у вас заканчиваются данные до преобразования первого аргумента, но я подозреваю, что только относится к scanf, а не к sscanf.

1

Другие решения

Для многих наборов инструментов (и я почти уверен, что IAR — один), если у вас есть символ в объектном файле и библиотеке, компоновщик будет ссылаться на один в объектном файле, а не в библиотеке.

Таким образом, вы можете предоставить свой собственный sscanf() Функция, чтобы связать во время тестов и вернуть все, что угодно.

Если у компоновщика есть проблема с символом конфликта между вашим sscanf() реализация и один в библиотеке, и альтернатива, которая может работать, состоит в том, чтобы у вас был юнит-тест sscanf() используйте другое имя (например, unittest_sscanf) и система сборки определяет макрос для переименования sscanf() во время сборки, используя что-то вроде /Dsscanf=unittest_sscanf для тестируемого модуля.

Конечно, может быть сложно убедиться, что другие sscanf() вызовы, которые не проверяются, не вызывают проблем.

1

По вопросам рекламы [email protected]