Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: функция strtok()
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
SatMinistry
Подскажите пожалуйста. Делаю парсер. Код следующий
Код
      while(1)
      {
         memset(Parser.CBuf,0,MAX_PARSER_CMD_BUF);  //очистка буфера
         GetString(Parser.CBuf);                    //получение команды в буфер
         command = strtok (Parser.CBuf, " ");       //команда - первое слово в буфере
        
         params = strtok (NULL, "w");              //следующее слово в буфере - параметры

         UART_printf ("\r\n>>параметры >>%s<<\r\n", params);

         ......................................
      }


даю с терминала команду вида:
Код
command1 w

(w у меня символ для флага что в буфере готова команда для парсера т.к. с \r и \n не работает - терминал их тупо не отправляет)
и результат выполнения
Код
command1 w
>>параметры >>‚<<

Откуда там эта запятая?
Savrik
Неплохо было бы проверять значение, возвращаемое strtok() Чувствую, там NULL...
А если хотите разбить строку по пробелу, то попробуйте вызвать второй раз как params = strtok (NULL, " ");
SatMinistry
я второй раз по пробелу не хочу разбивать...я понимаю что после первого разбиения должно быть command1 а после второго выходит что я w разбиваю по символу w и должен быть этот самый NULL а выводится некая запятая...
Хочу чтобы команда вида command1 paramsw разбивалась на command1 и params либо если не введены параметры чтобы был NULL по которому я определяю что типа юзер ошибся и не ввел параметры необходимые для данной команды.
Savrik
Ааа, я сразу не понял суть проблемы.. Значит, смотрите на переменную params - не глобальная ли она? Далее таки проверьте, действительно ли strtok() возвращает ноль.
SatMinistry
наверное частично я понял. прикол был вот в чем:
Код
char * params;

params - указатель у меня....поэтому чтобы напечатать то что в нем по идее надо написать так:
Код
UART_printf ("\r\n>>параметры >>%s<<\r\n", *params);


но остался вопрос все равно - почему тогда не выполняется условие
Код
if (params == NULL)
Savrik
Код
UART_printf ("\r\n>>параметры >>%s<<\r\n", *params);

Так точно работать не будетsmile.gifПри вызове функции компилятор автоматически преобразовывает тип массива в указатель на тип массива. Дайте код полностью, посмотрим....
SatMinistry
пока хотел вам выложить код наткнулся на то что протупил....организована получается структурка с командами
Код
_cmdtabl const CMDTABL[]=
  {
      {"led_r_on"        ,0       ,Led_R_On},
      {"led_r_tgg"       ,0       ,Led_R_Tgg},
      {"led_r_off"       ,0       ,Led_R_Off},
      {"led_y_on"        ,0       ,Led_Y_On},
      {"led_y_tgg"       ,0       ,Led_Y_Tgg},
      {"led_y_off"       ,0       ,Led_R_Off},
      {"leds_on"         ,2       ,Leds_On},
      {"leds_off"        ,2       ,Leds_Off},
      { NULL,0,0},
  };

и полученная строка сравнивается с командами в цикле пока не найдет что команда совпадает или команды такой нету. И стояла проверка чтобы не превысить максимального числа команд в этой таблице
Код
if (++i>MAX_PARSER_CMD) break;

а сама переменная MAX_PARSER_CMD от предыдущих экспериментов осталась меньше чем стало число команд krapula.gif

это с моим вопросом....а с принтф таки без * rolleyes.gif
Savrik
Хорошо, что сами нашли. Но все же очень советую почитать про указатели и ссылкиsmile.gif Литературы полно, можно и "библию" - Керниган Б., Ритчи Д. Язык программирования Си.
SatMinistry
читать читал....понимаю пока мало....посоветуйте что хорошего можно почитать после "библии" которая скорее как справочник а хотелось бы с много большим числом подробно поясненных примеров...в т.ч. разбор и использование стандартных библиотечных функций
Savrik
У меня в качестве настольной по стандартам C89\C99 книга Герберта Шилдта "C/C++. Справочник программиста". Очень хорошо описано, с примерами и подводніми камнями. По указателям - в свое время учился по книге С.В. Глушакова "Язык программирования С++", но книга в общем так себе..
SatMinistry
о, спасибо большое!
_Bill
Цитата(SatMinistry @ Jul 21 2010, 12:59) *
и полученная строка сравнивается с командами в цикле пока не найдет что команда совпадает или команды такой нету. И стояла проверка чтобы не превысить максимального числа команд в этой таблице

Зачем вообще нужна проверка на превышения числа команд? У вас же ограничитель таблицы команд имеется.


Модератор (rezident).
_Bill, поскольку личные сообщения Вы не читаете, то предупреждаю Вас прямо здесь. Еще раз обращаю Ваше внимание на то, что Вы регулярно нарушаете п.3.4 Правил форума (излишнее цитирование). Урезайте цитаты, пользуясь редактором сообщений, перед тем как их отправлять! За игнорирование Правил форума и требований модератора следует наказание в соответствии с п.5.1 Правил форума.
SatMinistry
наверное цикл по i так по i из него и выходить... unsure.gif это чужие исходники изучаю и под себя немного правлю
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.