Разбить строку char[] с символами разделителями на отдельные числа
- Войдите на сайт для отправки комментариев
Вс, 21/11/2021 - 15:56
Всем доброго дня. Помогите, пожалуйста, как мне разбить строку char[] без ардуиновского String. Мы принимаем пo Serial строку типа 10;153;10;135;OE;Её нужно разобрать на отдельные числа через atoi.
Как Вам помочь? Где Ваш код? Что именно у Вас не получается?
strtok
sscanf
Мы через Serial.readBytes принимаем в буфер строку. В ней через точку с запятой находятся числа. Их нужно оттуда получить и записать в отдельные переменные. Я не знаю как это реализовать без ардуиновской встроенной библиотеки String. Вот прошу помощи.
Так код-то Ваш где?
Или нет никакого кода? А как тогда Вам помогать? Скажите толком какой именно помощи Вы ждёте. Конкретно.
Все, разобрался.Всем спасибо.
char inData[25] = "125;242;1684;48"; //Input data char symbol[10] = ";"; char *istr; void setup() { Serial.begin(9600); istr = strtok (inData,symbol); while (istr != NULL){ Serial.println(istr); istr = strtok (NULL,symbol); } } void loop() {}А 10-то во второй строке нафига?
Мы через Serial.readBytes принимаем в буфер строку. В ней через точку с запятой находятся числа. Их нужно оттуда получить и записать в отдельные переменные. Я не знаю как это реализовать без ардуиновской встроенной библиотеки String.
Ну, вообще говоря, реализовать можно в точности так, как Вы написали. Просто представьте, что строку разбирает не микроконтроллер, а Вы сами. Подробно распишите алгоритм, что и как Вы будете делать, чтобы справиться с этой задачей. По русски. А потом останется только перевести на Си.
Беда, правда, в том, что описанный Вами алгоритм весьма неоптимален и может даже приводить в некоторых случаях к полной неработоспособности программы. Гораздо лучше не складывать принимаемые символы в буфер, а сразу разбирать строку посимвольно по мере получения из Serial.
Все, разобрался.Всем спасибо.
char inData[25] = "125;242;1684;48"; //Input data char symbol[10] = ";"; char *istr; void setup() { Serial.begin(9600); istr = strtok (inData,symbol); while (istr != NULL){ Serial.println(istr); istr = strtok (NULL,symbol); } } void loop() {}судя по коду не "разобрался", а "нашел готовое и списал".
Зачем в первой строке 25 символов, зачем во второй 10, к чему тут цикл while(), зачем переписывать указатель instr на NULL ? - уверен, что ни на один из этих вопросов вы не ответите
char str[20] = "125;242;1684;48"; int n[10] = {0}; //=============================== char* ptr = str; int sz = 0; do { if ( !isdigit(ptr[0]) ) break; n[sz++] = atoi(ptr); } while ( (ptr = strchr(ptr, ';')+1) != 1 ); //===============================В sz будет количество заполенных элементов массива n