реклама на сайте
подробности

 
 
> Странная работа оператора strtol, avr gcc
Skaf
сообщение Oct 22 2010, 17:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Всем привет. Пишу подпрограмму для конвертирования строки типа "00:1c:4f:a2:23:12" в 6 байт.

Использую функцию strtol

Код
unsigned long strtoul (const char * __nptr,  char ** __endptr,  int __base)


Судя по описанию __nptr указатель на строку, __endptr указатель на следующий символ после которого в строке не надо делать обработку, __base - система счисления строки

Долго боролся с глюками, в итоге соорудил маленький код в котором проявляется странное на мой взгляд поведение функции strtol. Объясните, пожалуйста, почему она модифицирует саму строку?

Строка- mac. Запись идет в data. Почему в mac изменяются 2 байта, а именно тот, на который указывает __endptr и следующий за ним? (код в картинке. Там же красным помечены изменившиеся байты из-за действий функции strtol)

PS- Последние 2 строки кода бессмыслены и существуют только для того, чтобы там поставить точку останова.

Сообщение отредактировал Skaf - Oct 22 2010, 17:07
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Oct 22 2010, 17:27
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Skaf @ Oct 22 2010, 21:06) *
Всем привет. Пишу подпрограмму для конвертирования строки типа "00:1c:4f:a2:23:12" в 6 байт.
Судя по описанию __nptr указатель на строку, __endptr указатель на следующий символ после которого в строке не надо делать обработку, __base - система счисления строки
Долго боролся с глюками, в итоге соорудил маленький код в котором проявляется странное на мой взгляд поведение функции strtol. Объясните, пожалуйста, почему она модифицирует саму строку?

Нет, __endptr - это не указатель на следующий символ, а указатель на указатель! Оттого-то перед ним стоят две звездочки, а не одна.
Заведите себе ОТДЕЛЬНЫЙ указатель, назовите его хотя бы endptr, например так:
char *endptr;
А в функцию strtoul подставите его АДРЕС, например вот так:
rusult = long strtoul("00:1c:4f:a2:23:12", &endptr, 16);
Тогда фунция ПОЛОЖИТ в endptr указатель на следующий символ после конвертированного.
Следующие числа можно будет достать так:
rusult = long strtoul(endptr+1, &endptr, 16);
где 1 прибавляется для пропуска двоеточия.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 04:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01367 секунд с 7
ELECTRONIX ©2004-2016