Парсинг массива char
- Войдите на сайт для отправки комментариев
Сб, 24/01/2015 - 00:09
Доброго времени стуок!
Задача, распарсить массив символов, не используя сторонние библиотеки.
Если на входе получаю GET / HTTP/1.1, то пропускаем такой заголовок
Елси же заголовок имеет вид GET /favicon.ico HTTP/1.1, то это запрос на скачивание файла favicon.ico
Опыт у меня не большой, попытался написать свой парсер, но в итоге застопорился на указателях. Учится на много быстрее на конкретных примерах, подскажите наиболее рациональный путь решения задачи.
а сколько всего вариантов на входе может быть ?
а сколько всего вариантов на входе может быть ?
На входе может быть что угодно, но мы ищем запрос GET
Если подобный запрос найден, смотрим что идет поле него
Если GET / HTTP/1.1, то это пустой заголовок, пропускаем, если же после слеша "/" не пробел - это запрос какого то файла, который и надо распарсить и затем считать с SD карты.
убираем все пробелы
если после GET/ >>>>>> HTTP......... - пропуск
если после GET/ >>>>>> не HTTP......... - то после GET/ до / - это нужная подстрока ?
убираем все пробелы
если после GET/ >>>>>> HTTP......... - пропуск
если после GET/ >>>>>> не HTTP......... - то после GET/ до / - это нужная подстрока ?
если после GET/ >>>>>> HTTP......... - пропуск
Да
если после GET/ >>>>>> не HTTP......... - то после GET/ до / - это нужная подстрока
Нет.
Значение между GET / и HTTP это и есть имя файла, HTTP не должно входить в имя
и вам в итоге нужен признак что это запрос и имя файла ?
и вам в итоге нужен признак что это запрос и имя файла ?
И то и другое. Сначала ищем GET, после нахождения которого выдергиваем имя файла
если не хотите использовать String,то мое предложение такое(хотя вы,кажется,сами все так и описываете.в чем вопрос тогда):перебираем запрос до первого слеша.дальше смотрим следующий символ,если пробел,то все ок,пропускаем запрос,если не пробел,то прекращаем работу с клиентом....нужно больше конкретики,тогда может что яснее подскажем...
если нужно именно выдергнуть имя файла,то соответственно,если после слеша не пробел,начинаем набивать наш массив символов до тех пор пока не появится точка(если только имя) или пробел,если имя с расширением..ну вы поняли=)
если не хотите использовать String,то мое предложение такое(хотя вы,кажется,сами все так и описываете.в чем вопрос тогда):перебираем запрос до первого слеша.дальше смотрим следующий символ,если пробел,то все ок,пропускаем запрос,если не пробел,то прекращаем работу с клиентом....нужно больше конкретики,тогда может что яснее подскажем...
Именно так, я хотел увидеть рабочий пример, т.е. как это реализуется на профессиональном уровне. Хотел увидеть код
у меня у самого не хватает знаний по char,не знаю как его "набивать"=)со String помог бы...
Не понял, вы хотите продублировать стандарные функции stdlib ?
В Си есть достаточно обширные средства анализа строки, вы хотите написать свои ?
Не понял, вы хотите продублировать стандарные функции stdlib ?
В Си есть достаточно обширные средства анализа строки, вы хотите написать свои ?
и моя тоже хочет :) , но вот такая запарка...
...не могу выловить вхождение подстроки
советую отказатся от объекта String и смотреть в сторону стандартной либы <string.h>. А конкретней в сторону strstr();
вот чем можно воспользоваться:
http://www.cplusplus.com/reference/cstring/
если я вас правильно понял.
спасибо ! :) , а то всю ночь убил.... будем изучать...
.....опять :( , всё - спать, потом читать
Не понял, вы хотите продублировать стандарные функции stdlib ?
В Си есть достаточно обширные средства анализа строки, вы хотите написать свои ?
Хотел, но передумал, не так то это просто оказывается.
вот такая запарка...
Без звёздочки, по-моему: tempStr = str;
А всё из-за привычки писать String *str, вместо String* str. :)
Не, я понимаю, тут кто как привык - переубеждать никого не собираюсь. Но сами же видите, к чему это приводит.
Насчёт разбора этой строки. По HTTP протоколу, формат у неё на самом деле такой:
<тип_запроса><пробел><идентификатор_ресурса><пробел><версия_протокола><конец_строки>
тип_запроса - GET или POST или HEAD... или даже ещё что-то - не помню.
идентификатор_ресурса - собственно, название того, что клиент хочет получить от сервера. Пробелов в нём, внутри, быть не может, не бойтесь - по протоколу не положено.
версия_протокола - тут всё понятно: HTTP, и циферки какие-нибудь.
конец_строки - если не ошибаюсь - символы '\r' и '\n'.
Соответственно, пробелы при разборе не выбрасываются, а используются для разделения строки на 3 подстроки.
Во второй подстроке получим или имя файла, или только слэш.
Помогите разобраться с функцией strtok
На powershell после разбиения подстроки помещаются в массив из которого можно выдернуть любой элемент, например:
В ответ получаем favicon.ico
А вот этот код ардуино никак не пойму:
После выполнения кода в str хранится "GET"
Если далее выполнить команду
str = strtok(NULL, " /");
Получим favicon.ico
Что то логика от меня ускользает
Всё правильно эта функция так и работает. Если первым параметром указан NULL то функция продолжает искать с того места где остановилась при предыдущем вызове. Т.е. если надо вторую лексему то надо вызвать strtok два раза, второй раз м NULL, если третью лексему надо то еще раз вызываем с NULL и т.д.
Спасибо!
Подскажите, как можно собирать char в строки?
Так не получается. Длина строки не известна, поэтому не могу объявить фиксированный массив.
strcat , наверное...
Как вариант, хотя String тут не рекомендовали использовать
String str="";
str += 'A';
str += 'B';
char * strcat ( char * destination, const char * source ); - это не из String , а из http://www.cplusplus.com/reference/cstring/ , также как и
strtok(str,
" /"
);
Подскажите, как можно собирать char в строки?
Так не получается. Длина строки не известна, поэтому не могу объявить фиксированный массив.
Раэмер буфера надо задавать с запасом, по максимуму.
А если хочется попроще - можно использовать другой тип данных: String
Этот тип уже заранее "обучили" операции сложения, и ещё некоторым другим.
Правда, скорее всего, прошивка займёт чуть больше места, и работать будет немного медленней - зато программировать так проще.
Да это я неграмотно написал :) Как вариант это три строчки которые я написал, а вариант потому что стринг не рекомендовали использовать :)
Подскажите, как можно собирать char в строки?
Так не получается. Длина строки не известна, поэтому не могу объявить фиксированный массив.
из той же библиотеки - size_t strlen ( const char * str );
Так получается.
Наивыший уровень развития личности (по пирамиде Маслоу) - Потребность в самоактуализации: реализация своих целей, способностей, развитие собственной личности. Я лично считаю что есть более высокий уровень развития - потребность делится накопленным опытом. На данном форуме я это вижу, спасибо!
Я лично считаю что есть более высокий уровень развития - потребность делится накопленным опытом. На данном форуме я это вижу, спасибо!
полностью присоединяюсь к мнению! :)
2rene приблизительно так :
Так получается.
Получается, но это неправильно. Этот код лезет в чужую память. По чистой случайности он там не убил ничего важного.
Вот так делайте. Или через String - он сам будет следить за правильным выделением памяти.
То что я и искал, спасибо, а стрингом я пытаюсь теперь не пользоваться, ибо тут сказали что это моветон
Дурной тон или нет, определяет не публика в интернете, а задачи и потребности конкретного проекта.
не получается прицепить char к char*
Так программа вообще ничего не выводит, пустой экран
так должно работать
Пробовал, это аналого моего char* a = &c; тоже пустой экран
Я только что у себя на ардуине пробовал, работает...
не получается прицепить char к char*
Может и не обязательно?
Или можно более другими способами, например вручную:
Не проверял, правда, но вроде нигде не ошибся.
strcat'ом нельзя цеплять &c, потому что strcat ожидает на входе строку, которая обязательно должна заканчиваться нулём.
Если написать strcat(strbuf, &c); - strcat попытается прицепить к строке то что лежит в c, и всё что лежит в памяти после этого c, до первого случайно встретившегося нуля. Результат получится совсем не тот, который хотелось, да и буфер скорее всего переполнится.
Я только что у себя на ардуине пробовал, работает...
Странно, вот полный скетч
Ошибится вроде как сложно, но у меня в терминале пустой экран. Mega 2560
У меня ваш скетч работает тоже мега 2560
Неправильный это скетч. Я там, выше, объяснял почему. Могу ещё, если хотите.
Только не знаю, что там не понятно?
strcat'ом нельзя цеплять &c, потому что strcat ожидает на входе строку, которая обязательно должна заканчиваться нулём.
Если написать strcat(strbuf, &c); - strcat попытается прицепить к строке то что лежит в c, и всё что лежит в памяти после этого c, до первого случайно встретившегося нуля. Результат получится совсем не тот, который хотелось, да и буфер скорее всего переполнится.
к сожалению я не могу прицепить просто символ, в оригинальном скетче команда выглядит так:
char c = client.read(); // читаем поступающие от клиента символы
т.е. на входе я получаю код символа
Неправильный это скетч. Я там, выше, объяснял почему. Могу ещё, если хотите.
Только не знаю, что там не понятно?
Я уже понял, попробовал так, не получается
Нужно найти способ прицепить 0 после кода символа, или же сразу код конвертировать в символ
strncat(strbuf, a, 1) и никакая чужая память не затронется.
Неправильный это скетч. Я там, выше, объяснял почему. Могу ещё, если хотите.
Только не знаю, что там не понятно?
Не рабочий код
Да! Это оно! Спасибо
Скажите, а такой код может считаться приемлемым? Вроде это позволяет не вводить дополнительных переменных для преобразования char в char* при использовании strtok
Не рабочий код
Не придирайтесь. :)
Или char* c = "1"; Или, в конце концов, так: strcat(strbuf, "1");
ЗЫ: strncat, конечно, тоже правильно, и даже правильней в несколько раз. :)
Я уже понял, попробовал так, не получается
Не получается, потому что в 5 строке должно быть char* a = c; (без амперсанда). И опять же, лишняя она - можно написать сразу: strcat(strbuf, c);
И ещё - в первой строке должно быть char c[2];