2013-12-05 2 views
0

Мне нужна помощь с sscanf. У меня есть файл данных. Я читал это по строкам. Одна строка выглядит так: 23,13,45;Разделенные целые числа с разделителями запятой и sscanf

Я хочу прочитать целые числа. Стараюсь этот код:

unsigned char a,b,c; 
sscanf(line,"%d,%d,%d;",&a,&b,&c); 

Но это не работает, только первый номер чтения, остальные 0.

ответ

1

Это потому, что %d ожидает указатель на 4-байтовое целое число, и вы передаете указатель на 1-байтовый char. Поскольку переменные a, b и c хранятся в порядке убывания адресов памяти, sscanf сначала заполняет a с 23, в то же время заполняя 3 других байта памяти стека нулями (это нарушение памяти, BTW). Затем он заполняет b с 13, также заполняя a и два других байта с нулями. В конце он заполняет c с 45, также заполняя a и b и еще один байт с нулями. Таким образом, вы получаете нули в b и a, а ожидаемое значение - только в c.

Конечно, это только один возможный сценарий того, что может произойти, поскольку это зависит от архитектуры и компилятора.

Правильный способ чтения 4 целых чисел состоял бы в том, чтобы использовать int вместо unsigned char или изменить спецификатор формата.

1

Правильный формат спецификатор для unsigned char является %hhu.

Помимо этого я не вижу никаких проблем, поскольку line содержит строку в ожидаемом формате.

+0

Почему% d является неправильным? Я знаю, что int больше, чем char. – user3072005

+0

Для '% d' sscanf() ожидает' подписанный int * ', но вы передаете указатели на' unsigned char', который является [неопределенным поведением] (http://en.wikipedia.org/wiki/Undefined_behavior). –

Смежные вопросы