ещё раз про strtok
- Войдите на сайт для отправки комментариев
Втр, 25/04/2017 - 10:29
Добрый день,
Помогите разобраться, почему не работает данный код:
Задача - разбирать полученную строку сначала на пары "переменная = значение", затем уже сами пары. Запрос может содержать любое количество пар.
else if(StrContains(HTTP_req, "GET /GTX?")) { //вид запроса GET /GTX?OUT_CircuPumpON=0&MHC_T_boil2=35&% HTTP/1.1 // sendXmlAnswer(cl); int i = 1; strtok(HTTP_req, "?"); // убираем GET /GTX char* httpreq = strtok(NULL, "%");// выделяем строку от ? до % strtok(httpreq, "&"); //Первая пара while (httpreq != NULL){ //Крутим пока не закончатся пары parsecom(i, httpreq); httpreq = strtok(NULL, "&"); i++; } }
И функция разбора пар:
void parsecom(int number, char* data){ Serial.print(number); Serial.print(" "); Serial.print(data);Serial.print("\n"); char* Valuename = strtok(data, "="); const char *lp_ptr = strtok(NULL, "="); int value = atoi(lp_ptr); for (byte i = 0; i < MAX_VAR; i++) {//сравниваем Valuename c нашими переменными if (!strcmp(Valuename, valuename_strs[i])) { values[i] = value; Serial.print( valuename_strs[i]); Serial.print(": "); Serial.print(values[i]); Serial.print("\n"); } } }
Если из функции убрать
char* Valuename = strtok(data, "="); const char *lp_ptr = strtok(NULL, "="); int value = atoi(lp_ptr);
То, на выходе в сериал мы получаем красивые пары с номером 1 OUT_CircuPumpON=0 ; 2 MHC_T_boil2=35 итд..
Но если начинаем разбирать пары внутри функции, то работает только первая пара и в цикл while программа даже не заходит, т.е. условие httpreq != NULL ложное. Из за чего это происходит? как strtok в функции влияет на выполнение когда основного кода?
могу показать как я работаю со строками запроса. без strtok
глоб переменные
функция чтения строки
дальше разбор идет вот в чем
вот что делают эти две функции
а эта функция меняет на новое значение если оно не совпадает со старым которое было
я не утверждаю что это правельно...
и да тут есть кое что лишнее.
1. Не стоит запускать несколько цепочек strtok одновременно - они мешают друг другу. А у Вас они запускаются (одна внешняя, а другая внутри функции parsecom).
2. strtok гадит в строку с которой работает (помещает 0 на место найденного разделителя), это надо иметь в виду.
Я не понял. что там у Вас за фокусы вначале с ? и % - это Вы сами разберётесь. Я могу показать как разобрать строку типа
http://www.kaka.com/page.htm?a=123&kaka=mumu&b=1&p1=eshe_parameter
на имена и значения параметров.
Вот смотрите полный, работающий пример - там делов-то ...
Строку 5 вставщик кода переврал. Должна выглядеть как
char *request = "http://www.kaka.com/page.htm?a=123&kaka=mumu&b=1&p1=eshe_parameter";
Результат:
Большое спасибо!
Работает в таком виде:
У меня ругается при компиляции примера ЕвгенийП. Что не так?
Хрен его знает куда делся кусок из первой строки. Правильная первая строка вот такая
В том посте подправить уже нельзя :(
Компилирует, но осталось:
/home/stable/Dropbox/Arduino/String-Serial/String-parse-D/String-parse-D.ino: In function 'void setup()':
Ну, Вы читать умеете? Во-первых это не ошибка, а предупреждение, а во-вторы, там же ясно написано, что автоматическое преобразование строковой константы в char * устарело.
Можете плюнуть, а можете после знака = написать (char *) - заткнётся.