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

 
 
> функция strtok(), непонятка с парсером команд
SatMinistry
сообщение Jul 20 2010, 09:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870



Подскажите пожалуйста. Делаю парсер. Код следующий
Код
      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
>>параметры >>‚<<

Откуда там эта запятая?

Сообщение отредактировал SatMinistry - Jul 20 2010, 09:30
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
Savrik
сообщение Jul 20 2010, 10:54
Сообщение #2


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Неплохо было бы проверять значение, возвращаемое strtok() Чувствую, там NULL...
А если хотите разбить строку по пробелу, то попробуйте вызвать второй раз как params = strtok (NULL, " ");
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jul 20 2010, 11:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870



я второй раз по пробелу не хочу разбивать...я понимаю что после первого разбиения должно быть command1 а после второго выходит что я w разбиваю по символу w и должен быть этот самый NULL а выводится некая запятая...
Хочу чтобы команда вида command1 paramsw разбивалась на command1 и params либо если не введены параметры чтобы был NULL по которому я определяю что типа юзер ошибся и не ввел параметры необходимые для данной команды.
Go to the top of the page
 
+Quote Post
Savrik
сообщение Jul 20 2010, 12:03
Сообщение #4


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Ааа, я сразу не понял суть проблемы.. Значит, смотрите на переменную params - не глобальная ли она? Далее таки проверьте, действительно ли strtok() возвращает ноль.
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jul 21 2010, 08:04
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870



наверное частично я понял. прикол был вот в чем:
Код
char * params;

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


но остался вопрос все равно - почему тогда не выполняется условие
Код
if (params == NULL)
Go to the top of the page
 
+Quote Post
Savrik
сообщение Jul 21 2010, 08:27
Сообщение #6


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



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

Так точно работать не будетsmile.gifПри вызове функции компилятор автоматически преобразовывает тип массива в указатель на тип массива. Дайте код полностью, посмотрим....
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jul 21 2010, 08:59
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870



пока хотел вам выложить код наткнулся на то что протупил....организована получается структурка с командами
Код
_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

Сообщение отредактировал SatMinistry - Jul 21 2010, 09:01
Go to the top of the page
 
+Quote Post
Savrik
сообщение Jul 21 2010, 09:22
Сообщение #8


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Хорошо, что сами нашли. Но все же очень советую почитать про указатели и ссылкиsmile.gif Литературы полно, можно и "библию" - Керниган Б., Ритчи Д. Язык программирования Си.
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jul 21 2010, 09:54
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870



читать читал....понимаю пока мало....посоветуйте что хорошего можно почитать после "библии" которая скорее как справочник а хотелось бы с много большим числом подробно поясненных примеров...в т.ч. разбор и использование стандартных библиотечных функций
Go to the top of the page
 
+Quote Post
Savrik
сообщение Jul 21 2010, 11:14
Сообщение #10


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



У меня в качестве настольной по стандартам C89\C99 книга Герберта Шилдта "C/C++. Справочник программиста". Очень хорошо описано, с примерами и подводніми камнями. По указателям - в свое время учился по книге С.В. Глушакова "Язык программирования С++", но книга в общем так себе..
Go to the top of the page
 
+Quote Post
DL36
сообщение Jul 21 2010, 12:31
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



книга Герберта Шилдта "C/C++. Справочник программиста".
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jul 21 2010, 14:53
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870



о, спасибо большое!
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 22 2010, 04:56
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(SatMinistry @ Jul 21 2010, 12:59) *
и полученная строка сравнивается с командами в цикле пока не найдет что команда совпадает или команды такой нету. И стояла проверка чтобы не превысить максимального числа команд в этой таблице

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


Модератор (rezident).
_Bill, поскольку личные сообщения Вы не читаете, то предупреждаю Вас прямо здесь. Еще раз обращаю Ваше внимание на то, что Вы регулярно нарушаете п.3.4 Правил форума (излишнее цитирование). Урезайте цитаты, пользуясь редактором сообщений, перед тем как их отправлять! За игнорирование Правил форума и требований модератора следует наказание в соответствии с п.5.1 Правил форума.
Причина редактирования: нарушение п.3.4 Правил форума. Излишнее цитирование.
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jul 22 2010, 19:42
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 11-06-10
Пользователь №: 57 870



наверное цикл по i так по i из него и выходить... unsure.gif это чужие исходники изучаю и под себя немного правлю
Go to the top of the page
 
+Quote Post

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

 


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


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