Работа с массивом char

mcmega
Offline
Зарегистрирован: 12.02.2014

Всем привет!

Нужна помощь. Есть массив char, который имеет вид:

данные\r\n\r\n,{данные}\r\n\r\n

Меня интересует только то ,{данные}

Я нахожу последовательность \r\n\r\n,{ и начиная с ,{ сохраняю указатель в temp

char *  temp = strstr((char*)inPack, "\r\n\r\n,{") + 4;

А как сейчас сохранить все до вторых \r\n\r\n?

Sr.FatCat
Offline
Зарегистрирован: 19.02.2016

mcmega пишет:



А как сейчас сохранить все до вторых \r\n\r\n?


Что значит "сохранить"? Сделать копию этого куска? Или достаточно сохранить указатели или позиции начала и конца?

Вообще, если свободная память позволяет, категорически рекомендую использовать для всех работ со строками String, позволяет избежать огромного количества проблем.
 

sadman41
Offline
Зарегистрирован: 19.10.2016

Число вариантов решения тут более одного. Если после ,{данные} ничего не нужно более, то ищете, начиная с temp, указатель на } или }\r\n\r\n и пишете в эту позицию '\0'. В итоге у вас по адресу temp будет расположена NUL-терминированная строка.

mcmega
Offline
Зарегистрирован: 12.02.2014

sadman41 пишет:

Число вариантов решения тут более одного. Если после ,{данные} ничего не нужно более, то ищете, начиная с temp, указатель на } или }\r\n\r\n и пишете в эту позицию '\0'. В итоге у вас по адресу temp будет расположена NUL-терминированная строка.

String не могу использовать, потому что много памяти занимает, поэтому перевожу все на char

Да, после } ничего не нужно. Покажите что дальше нужно делать?

Суть такая, что я в каждой итерации цикла получаю данные\r\n\r\n,{данные}\r\n\r\n и мне нужно их в итоге сложить в 1 большую строку (получить синтаксис json)

[{данные},{данные},{данные}...]

 

sadman41
Offline
Зарегистрирован: 19.10.2016

То же самое, что и делали с inPack, но в temp. '\0' по указателю, думаю, вам нужно самостоятельно научиться записывать, а то никуда вы от String не убежите.

mcmega
Offline
Зарегистрирован: 12.02.2014

Я как вариант думаю использовать символы STX и ETX, буду пробовать, спасибо

sadman41
Offline
Зарегистрирован: 19.10.2016

mcmega пишет:

Суть такая, что я в каждой итерации цикла получаю данные\r\n\r\n,{данные}\r\n\r\n и мне нужно их в итоге сложить в 1 большую строку (получить синтаксис json)

[{данные},{данные},{данные}...]

В таком случае лучше сделать так, чтобы в строке оставалось {данные} (со скобочками). Указателям -1 и +1 сделаете и потом strcpy() в свою большую строку. 

На следующей итерации оптимизации, когда поймете, как работает этот, будете искать указатель на начало искомой строки и на конец, потом memcpy() с разницей между "конечным" указателем и "начальным".

mcmega
Offline
Зарегистрирован: 12.02.2014

Я так подумал, строка будет проще тогда

данные\r\n\r\nSTX,{данные}ETX

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я понятия не имею, как проще, так как вы правила игры меняете на ходу.

mcmega
Offline
Зарегистрирован: 12.02.2014
char *  temp = strchr((char*)inPack, STX);
int body_len = strchr(temp, ETX) - strchr(temp, STX) - 1;
char *body = (char*)malloc(body_len + 1);
strncpy(body, strchr(temp, STX) + 1, body_len);
body[body_len] = '\0';
Serial.print(body);

Вроде так заработало

sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем так много вычислений и два способа сразу для решения одной задачи? ETX нашли - на его место '\0' воткнули. Строка готова для strcpy(). А если уж вычислили body_len, то для понятности  и мизерного снижения оверхеда делайте memcpy()(ну, я бы так сделал). И осторожней с malloc, тут не ПК - некому будет оптимизировать ваши дырки в памяти.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Число вариантов решения тут более одного. 

Я бы сказал, "более, чем 100500"

ТС,

Вам вот сюда и читать описания всех функций, начинающихся с str до полного просветвления. Заодно, много чего общеполезного узнаете и серьёзно прокачаете свои умения.

Sr.FatCat
Offline
Зарегистрирован: 19.02.2016

Ну да. Ровно один в один задача была на ГИА. Т.е., даже не на ЕГЭ. В зависимости от школы решалась на паскале, С, питоне.
 

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Вам вот сюда и читать описания всех функций, начинающихся с str до полного просветвления. Заодно, много чего общеполезного узнаете и серьёзно прокачаете свои умения.

Вот злой ты чоловик, нет что-нибудь наше, православное, на кириллице. Знай пихает богомерзкое, протестантско-католическое, на непатриотичном инглише.))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bwn пишет:

 нет что-нибудь наше, православное, на кириллице. Знай пихает богомерзкое, протестантско-католическое, на непатриотичном инглише.))))

Ну, нет! Не надо переводить стрелки! ТС спросил про богомерзкий вражеский атмел, вот и пришлось ему атмеловскую документацию давать. Нет чтобы ТС на родном МК60 или там Эльбрусе свои поделки ваять - тогда б я ему православную документацию дал. А в этом пятоколонном атмеле, даже на богомерзком С++ программировать приходится (см. о богомерзкости и неправославности С++).

arduinec
Offline
Зарегистрирован: 01.09.2015

mcmega пишет:

Всем привет!

Нужна помощь. Есть массив char, который имеет вид:

данные\r\n\r\n,{данные}\r\n\r\n

Меня интересует только то ,{данные}

Я нахожу последовательность \r\n\r\n,{ и начиная с ,{ сохраняю указатель в temp

char *  temp = strstr((char*)inPack, "\r\n\r\n,{") + 4;

А как сейчас сохранить все до вторых \r\n\r\n?

char * temp = strstr((char*)inPack, "\r\n\r\n,{") + 4;
char * temp2 = strstr(temp, "\r\n\r\n");
temp2[0] = 0;

В результате: temp = {данные}