sscanf переполнен адресами назначения - PullRequest
0 голосов
/ 18 февраля 2019

Я анализирую строку IP в C, и я использую следующую строку:

typedef unsigned char UI_8;
UI_8 TFTP_IP_NUMBERS[4];
UI_8 TFTP_IP[15]; // Should  be something lige "192.168.12.30" 
sscanf(TFTP_IP , "%d.%d.%d.%d", TFTP_IP_NUMBERS[0],
                                TFTP_IP_NUMBERS[1],
                                TFTP_IP_NUMBERS[2], 
                                TFTP_IP_NUMBERS[3]);

Строка работает отлично (она анализирует правильно), но она пишет в местах, где она не должна писать.В адресах памяти с «XX» значения хранятся правильно, но адреса памяти с «AA» переопределяются с помощью «00».

XX XX XX XX AA AA AA

Что может быть причиной такого поведения?Как этого можно избежать

Я ожидаю иметь:

TFTP_IP_NUMBERS = [192,168,12,30]

1 Ответ

0 голосов
/ 18 февраля 2019

Спецификатор формата %d обрабатывает int, вы передаете ему меньше unsigned char, а также неправильно передаете указатель (две ошибки).

int ip_parts[4];
sscanf( ip, "%d.%d.%d.%d", &ip_parts[0], 
                           &ip_parts[1],
                           &ip_parts[2],
                           &ip_parts[4] ) ;

Вы могли бы писать напрямую в unisigned char, используя спецификатор формата %hhd, но модификатор размера hh поддерживается не всеми библиотеками и будет делать код менее переносимым.Тот факт, что вы использовали тип UI8_t, предполагает, что у вас может не быть стандартного uint8_t, и, возможно, вы не используете C99-совместимую библиотеку или компилятор - в этом случае %hhu также может не работать.

UI8 ip_parts[4];
sscanf( ip, "%hhu.%hhu.%hhu.%hhu", &ip_parts[0], 
                                   &ip_parts[1],
                                   &ip_parts[2],
                                   &ip_parts[4] ) ;
...