Есть такая строка: Код (C++): char str[] = "PRIVET_#BEGtestik#END_GOODBY"; Из этой строки мне нужно ПОБАЙТНО обратится к содержимое между #BEG и #END В Сях я совсем не разбираюсь. Получилось, что такое и оно вроде как даже работает. Код (C++): void setup() { Serial.begin(115200); char str[] = "PRIVET_#BEGtestik#END_GOODBY"; char *ptr_beg; // Указатель на начало char *ptr_end; // Указатель на конец ptr_beg = strstr (str, "#BEG"); ptr_end = strstr (str, "#END"); if (ptr_beg == NULL) { Serial.println("не найдено начало"); return; } if (ptr_end == NULL) { Serial.println("не найден конец"); return; } ptr_beg+=4; for (ptr_beg; ptr_beg < ptr_end; ptr_beg++) { Serial.println(*ptr_beg); } } void loop() { } Так можно сделать или это криво совсем?
Про UTF я в курсе, если в массиве между #BEG.....#END будут русские буквы, там будет отдельный обработчик. В рамках данной задачи считаем, что использование кириллицы в строке не предполагаетЦО
Да и вообще с Кирилицей в Ардуине проблем нет - она там все за тебя делает ))) Код (C++): void setup() { Serial.begin(115200); char str[] = "PRIVET_#BEGtest_привет_мир!#END_GOODBY"; char *ptr_beg; // Указатель на начало char *ptr_end; // Указатель на конец ptr_beg = strstr (str, "#BEG"); ptr_end = strstr (str, "#END"); if (ptr_beg == NULL) { Serial.println("не найдено начало"); return; } if (ptr_end == NULL) { Serial.println("не найден конец"); return; } ptr_beg+=4; String S; for (ptr_beg; ptr_beg < ptr_end; ptr_beg++) { char s = *ptr_beg; S += s; } Serial.println(S); } void loop() { }
вообще, строка сдвигает указатель на 4 char элемента вправо и делает это жёстко. Если вместо будет Unicode с двумя байтами на символ, то будет сюрприз. Поэтому все длины я отдаю на откуп компилятору (или препроцессору) - им виднее, что там да как.
Вы сюда поспорить пришли? Или ответ получить? Может, вместо спора, продуктивнее спросить, а как это сделать с наименьшими усилиями? Получить ответ, что для исключения проблем, достаточно вместо Код (Text): ptr_beg += 4; написать Код (Text): ptr_beg += sizeof("#BEG") - 1; и получить новое знание? Или поспорить приятнее? Я вот хотел ещё несколько замечаний сделать, но что-то расхотелось. Бить пальцы об клавиши, чтобы Вы меня так же как паровоза послали и стали доказывать, что у Вас и так всё хорошо? Оно мне надо? У Вас всё хорошо, не возражаю.
За новое знание конечно спасибо, только в конечной программе планируется использование около 40 разных подобных идентификаторов (что-типа самодельного макроязыка) и мне проще их сделать стандартной длинны и уж точно без кириллицы.... Все что меня интересовало - как правильно сделать поиск в ЭТОЙ КОНКРЕТНОЙ СТРОКЕ? Не будет у меня в этой строке ничего кроме assi кодировки - так зачем мне знания к теме вопроса не относящиеся? Мне нужен был либо кусок кода, либо совет какой погуглить оператор или, а не как использовать символы, использование которых не предполагается.
Обо всём об этом мы узнали только сейчас, ибо вопрос был поставлен так (сразу после простыни с кодом): с точки зрения машины, символы в строке не делятся на извращённые и не извращённые. Я уже показывал, что если научится владеть инструментом, то работать можно с чем угодно. Сложность при работе с обычными ASCII кодировками только лишь одна - можно использовать только английский и ещё какой-то, но один, язык. Хочешь третий язык - придётся переключить ASCII таблицу. Хочешь смайлики - переключись ещё на одну.
Думаю, как-нибудь так: Код (C): #include <string.h> #include <stdio.h> void setup() { Serial.begin(115200); char str[] = "PRIVET_#BEGtestik#END_GOODBY"; char *beg = strstr(str, "#BEG"); char *end = strstr(str, "#END"); if (!beg || !end || beg >= end) { Serial.println("Ошибка формата"); return; } beg += 4; // пропускаем "#BEG" for (char *p = beg; p < end; p++) { Serial.print("Байт: 0x"); Serial.print((uint8_t)*p, HEX); Serial.print(" '"); Serial.print(*p); Serial.println("'"); } } Но лично я б сделал вот так, если нет ограничений по скорости. Всё - в отдельный массив, а потом делай с ним что хошь. Код (C): void setup() { Serial.begin(115200); char str[] = "PRIVET_#BEGtestik#END_GOODBY"; char result[32]; // массив для результата // Формат: пропустить всё до #BEG, затем взять всё до #END if (sscanf(str, "%*[^#]#BEG%[^#]#END", result) == 1) { Serial.print("Нашли: "); Serial.println(result); // Побайтный вывод (если нужно) for (int i = 0; result[i] != '\0'; i++) { Serial.print("Байт: "); Serial.println((int)result[i]); } } else { Serial.println("Не найдено"); } } Ну да, читабельность %*[^#]#BEG%[^#]#END" оставляет желать лучшего. Хотя в сравнении с настоящими регэкспами...