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

0

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

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++.)

FYI, мы используем процессор ARM7 с IAR Embedded Workbench.

  • 0
    Пытаетесь ли вы сделать так, чтобы оно вернулось больше 2, или вы пытаетесь убедиться, что ваше заявление if никогда не пропустит ошибку? Но нет никакой разницы для C ++.
  • 2
    Если поле alarm_text в text_string когда-либо имеет text_string 16 или более символов, формат %16s будет писать '\0' сразу после конца массива alarm_text . Массив alarm_text должен содержать 17 элементов или спецификатор формата должен быть %15s .
Показать ещё 5 комментариев
Теги:
scanf
format-specifiers

2 ответа

1
Лучший ответ

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

  • 0
    И поскольку EOF гарантированно будет отрицательным (даже если он не гарантированно равен -1), он все равно не будет возвращать значение больше 2.
1

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

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

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

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

  • 0
    +1 За предложение отдельного sscanf для юнит-тестирования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню