messenger 0 28 декабря, 2016 Опубликовано 28 декабря, 2016 · Жалоба Здравствуйте! сдера разработки CVAVR Разбираю строку полученную по UART После того как стал использовать указатели CVAVR "стал странно себя вести" Не работает защита на длинну команды и их количества if (count_cmd<LEN_CMD) //защита на 5 символов if (i<COL_CMD) //защита на 5 строк вот что принимаю z:xx:123456:v:b:n[9] z xx 123456v v b n Помогите пожалуйста //================================================================================ ================== // Дано: строка вида 123:567:901:345[118.1] // ф-ция strtok заменяет разделители ':[]' на конец строки '\0' // т.о. читая по указателю строку, чтение заканчивается на '\0', после чего // ф-ция вызывая strtok повторно смещаем указатель и так до NULL //================================================================================ ================== void razbor_cmd() { int LEN_CMD=6; int COL_CMD=6; char cmd[6][6]; // Кол-во команд / Длинна команды 5! int i=0,count_cmd=0; char *pch; pch = strtok (rx_buffer,":[]"); count_cmd=0; while (pch != NULL) //пока есть лексемы { if (count_cmd<LEN_CMD) //защита на 5 { i=0; while (*pch!='\0') { if(i<COL_CMD) { cmd[count_cmd][i++]=*pch++; cmd[count_cmd]='\0'; } } } count_cmd++; pch = strtok (NULL, ":[]");//NULL-искать в той же строке } for (i=0; i<(count_cmd); i++) {printf("%s\r\n", cmd);} } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Указатели тут не при чем. Судя по названию и применению LEN_CMD и COL_CMD они перепутаны местами Размер массива cmd[] (6) меньше, чем требуется в COL_CMD - нет места для завершающего строку 0 Печать принятых соманд делается по счетчику count_cmd, который может быть больше, чем число команд в массиве, т.к. привышение количества команд блокирует запись их в массив, но не блокирует увеличение счетчика count_cmd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться