powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Реализация split в C
22 сообщений из 22, страница 1 из 1
Реализация split в C
    #38980392
Generalproger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, связался с контроллером Arduino где программирование идет на C и никак не могу понять как организовать нарезку текста, да и к тому же тип данных у меня char, а как его нормально преобразовать в String я еще не нашел.

Формат информационных сообщений может быть разный, но мне нужно обрабатывать по шаблону:
/r
+CMT: (любые символы)/r
команда+команда+команда/r

На каком-нибудь JS у меня получилось бы так:
Кодtext="
+CMT: "+79643437397","","15/06/09,17:34:01+12"
1+ON+60
";
aa = text.split("\r\n");
if (aa.length==3) {
bb = aa[1].split("+");
// обработка команды
}
...
Рейтинг: 0 / 0
Реализация split в C
    #38980393
Generalproger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как организовать такой код только на C с учетом того что тип данных у переменной text будет char?
...
Рейтинг: 0 / 0
Реализация split в C
    #38980445
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жесть
...
Рейтинг: 0 / 0
Реализация split в C
    #38980522
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Generalproger,

если нужно именно С, и регвыражения в общем, рекомендую библиотеку (lib)pcre.

конкретно в этом случае конечно же можно обойтись вообще без рег. выражений.
бежишь по строке и в массив складываешь координаты начала и конца строки в массиве, потом кусками обрабатывать.
...
Рейтинг: 0 / 0
Реализация split в C
    #38980540
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Generalproger,

Есть такая функция : strtok() - можно поиспользовать ее.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <stdio.h>
#include <string.h>
#include<malloc.h>
int main (void) {

    char str[] = "John|Doe|Melbourne|6270|AU";
    char *fname, *lname;    /* тут дальше указатели на куски, которые тебе нужны */ 
    char *oldstr = malloc(sizeof(str));
    strcpy(oldstr,str);         
    fname=strtok(str,"|");   /*разделитель "|" */
    lname=strtok(NULL,"|");
    /* ну и т.д. */
    printf("Firstname: %s\n", fname);
    printf("Lastname: %s\n", lname);
    free(oldstr);
    return 0;
}
...
Рейтинг: 0 / 0
Реализация split в C
    #38980581
Generalproger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,

А не подскажете где скачать malloc.h, в моей среде разработки он отсутствует....
...
Рейтинг: 0 / 0
Реализация split в C
    #38980584
Generalproger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,

Сунул вот эту ( http://gee.cs.oswego.edu/pub/misc/malloc.h ) malloc.h в итоге ошибка:

27 char *oldstr = malloc(sizeof(str));

Blink:27: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
invalid conversion from 'void*' to 'char*' [-fpermissive]
...
Рейтинг: 0 / 0
Реализация split в C
    #38980587
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GeneralprogerDarkMaster,

Сунул вот эту ( http://gee.cs.oswego.edu/pub/misc/malloc.h ) malloc.h в итоге ошибка:

27 char *oldstr = malloc(sizeof(str));

Blink:27: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
invalid conversion from 'void*' to 'char*' [-fpermissive]

http://ideone.com/KXTl90

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main (void) {

    char str[] = "John|Doe|Melbourne|6270|AU";
    char *fname, *lname;    /* тут дальше указатели на куски, которые тебе нужны */ 
    char *oldstr = (char *)malloc(sizeof(str));
    strcpy(oldstr,str);         
    fname=strtok(str,"|");   /*разделитель "|" */
    lname=strtok(NULL,"|");
    /* ну и т.д. */
    printf("Firstname: %s\n", fname);
    printf("Lastname: %s\n", lname);
    free(oldstr);
    return 0;
}
...
Рейтинг: 0 / 0
Реализация split в C
    #38980596
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Generalproger,

Ты хоть среду назови... Кстати, ты случаем не под микропроцессоры это пишешь (там может быть, что придется еще и malloc() и strtok() самому реализовывать)?
...
Рейтинг: 0 / 0
Реализация split в C
    #38980610
Generalprogerсвязался с контроллером Arduino
Сайт_производителяThe ATmega328 chip found on the Uno has the following amounts of memory:

Flash 32k bytes (of which .5k is used for the bootloader)
SRAM 2k bytes
EEPROM 1k byte

The ATmega2560 in the Mega2560 has larger memory space :

Flash 256k bytes (of which 8k is used for the bootloader)
SRAM 8k bytes
EEPROM 4k byte

Почему-то я не удивлен, что при 2K оперативки они не стали Heap реализовывать )))
...
Рейтинг: 0 / 0
Реализация split в C
    #38980630
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жесть_жесть_жесть,

Н-да, вот что значит по диагонали читать - про микроконтроллер я как-то упустил.... Тогда может ну его этот ихний обрубанный С нафиг и все на асме сделать? А то на реализацию рантайма можно кучу времени потратить...

2ТС - а по-конкретнее задачу можно обрисовать? Зачем тебе строку "сплитить" нужно?
...
Рейтинг: 0 / 0
Реализация split в C
    #38980654
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeneralprogerЗдравствуйте, связался с контроллером Arduino где программирование идет на C...взаимодействие с Arduino можно построить не только на C, но и на С++, С#, PERL и Python.

http://robocraft.ru/blog/arduino/76.html
...
Рейтинг: 0 / 0
Реализация split в C
    #38980656
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На DevCon один из докладчиков показывал устройство на базе Arduino для налива пива.
И управлял этим устройством из Cordova (PhoneGap) приложения.
...
Рейтинг: 0 / 0
Реализация split в C
    #38980670
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterGeneralproger,

Ты хоть среду назови... Кстати, ты случаем не под микропроцессоры это пишешь (там может быть, что придется еще и malloc() и strtok() самому реализовывать)?
так пусть не запоминает старую строку и не надо будет malloc free
...
Рейтинг: 0 / 0
Реализация split в C
    #38980672
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
aa = text.split("\r\n");
if (aa.length==3) {
  bb = aa[1].split("+");
...

ааааааа, ну массив указателей на куски, нарезанные до ифа,
длиной 10(может 20) завести
...
Рейтинг: 0 / 0
Реализация split в C
    #38980675
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeneralprogerDarkMaster,

Сунул вот эту ( http://gee.cs.oswego.edu/pub/misc/malloc.h ) malloc.h в итоге ошибка:

27 char *oldstr = malloc(sizeof(str));

Blink:27: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
invalid conversion from 'void*' to 'char*' [-fpermissive]


Вася Уткин char *oldstr = (char *) malloc(sizeof(str));
...
Рейтинг: 0 / 0
Реализация split в C
    #38980985
Generalproger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tchingiz,

Спасибо, здесь теперь все ясно, осталась еще одна проморочка - сами данные я получаю из Serial.read();
Это как я понял нечто подобное InputStream в Java, надо как-то объединять их, не понимаю как, += и .concat не помогают:

Внутри циклаif(SIM900.available() > 0){
Serial.print(SIM900.read());
}

Как я понял при получении нового байта текущий вариант выписывает его в консоль, попытался завести константу
char otp = 0;
и попробывать добавлять к ней новые байты
char otp+= SIM900.read();
Похоже тут нужны какие-то типы более хитрые, попробывал:
char otp[] = {0};
...
otp.concat(SIM900.read())

тоже что-то не то получается, короче говоря задумка в следующем: буду набирать строку до переноса строки и дальше проверять является ли она командой отосланной в СМС. Только как организовать склеивание строк не пойму?

Да и заранее еще вопрос - если строка будет набираться не с типом char name[] ... то как мне её потом всунуть в кусок кода где strkok?
...
Рейтинг: 0 / 0
Реализация split в C
    #38981378
Generalproger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во всем по проблеме работы с char разобрался, тему можно закрывать , всем кто помог - огромное спасибо!
...
Рейтинг: 0 / 0
Реализация split в C
    #38981380
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Generalproger
Может быть сначала хоть книжку по C прочитать?
Хотя бы бегло. По диагонали.

Как можно писать на языке программирования, даже элементарно не понимая что:
char - это СИМВОЛ
а строка - это совсем НЕ один символ

Ну и кроме книжек по C, хорошо бы и книжку по железке с которую Вы "связались" прочитать. Вроде даже в банальном ките за 8 тыс. руб, обещают наличие и средств разработки и книжки и даже видео-уроков.
...
Рейтинг: 0 / 0
Реализация split в C
    #38982308
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeneralprogerDarkMaster,

А не подскажете где скачать malloc.h, в моей среде разработки он отсутствует....

Вот с этого момента поподробнее, пожалуйста ...
...
Рейтинг: 0 / 0
Реализация split в C
    #38982310
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeneralprogerDarkMaster,

А не подскажете где скачать malloc.h, в моей среде разработки он отсутствует....

malloc тут использовать вовсе не обязательно, можно и в статичной памяти то же самое сделать.
...
Рейтинг: 0 / 0
Реализация split в C
    #38982347
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivGeneralprogerDarkMaster,

А не подскажете где скачать malloc.h, в моей среде разработки он отсутствует....

Вот с этого момента поподробнее, пожалуйста ...

А у него микроконтроллер. Соответственно кучки функций не хватает - не реализовали.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Реализация split в C
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]