Помогите разбить слово на 2 переменные.

Тема в разделе "Arduino & Shields", создана пользователем Dima85, 20 авг 2014.

  1. Dima85

    Dima85 Нерд

    Есть текст:
    tester=1

    Его нужно разделись опираясь на =, то есть в одну переменную поместить tester в другую 1.
    Подскажите пожалуйста как это реализовать.
     
  2. NR55RU

    NR55RU Гик

    Если вы знакомы с тем что из себя представляю строки в Си, то вопрос мне не ясен, в чем могут быть затруднения, если не знакомы, я вам настоятельно рекомендуется в этом разобраться. Поможет в будущем :)

    В целом приведу самый простой пример из разряда "В ЛОБ", он не безопасен и не учитывает множества аспектов, для которых надо четко понимать с какими данными мы будем иметь дело и чего именно мы хотим получить в итоге. Но в качестве общего примера пойдет.

    Код (Text):
    const int BUFF_SIZE = 32;
    char string[] = "tester=1";
    char name[ BUFF_SIZE ] = {0};
    char value[ BUFF_SIZE ] = {0};

    // Адрес текущего символа в разбираемой строке
    char *current = string;

    // Отделяем название
    int i = 0;
    while ( *current != '=' )
    {
        name[i] = *current;
        i++;
        current++;
    }
    name[i] = '\0';
    current++;

    // Отделяем значение
    i = 0;
    while ( *current != '\0' )
    {
        value[i] = *current;
        i++;
        current++;
    }
    value[i] = '\0';
     
    В итоге у вас в масивах:
    name - tester\0
    value - 1\0
    \0 это NULL байт на конце для указания "конца" строки.

    Далее можете делать с этим что желаете, в частности если из единицы вы желаете получить целочисленое значеинние то функция atoi() вам поможет :)
     
  3. Dima85

    Dima85 Нерд

    Я ожидал увидеть меньше кода. В php подобную задачу можно реализовать так:
    Код (Text):
    $string = "a|b";
    list($a, $b) = explode("|", $string);
    Может в arduino тоже есть "explode"?
     
  4. AlexVS

    AlexVS Гик

    В arduino воще ничего нет, это просто микроконтроллер установленный на плату с обвязкой.
    Есть только то, что есть в Cи, а работу со строками в Си - не назовешь удобной, сам мучаюсь :(
     
  5. NR55RU

    NR55RU Гик

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

    Код (Text):
    const int BUFF_SIZE = 32;
    char string[] = "tester=1";
    char name[ BUFF_SIZE ] = {0};
    int value = 0;

    sscanf(string, "%[a-z]=%i", name, &value);
    Но опять же, есть свои НО, это просто минимальный пример :)
     
  6. Dima85

    Dima85 Нерд


    Шикарный вариант. Спасибо большое.
    Скажите пожалуйста, с точки нагрузки на arduino, с каким вариантом arduino проще работать с первый или этим? Где меньше ресурсов расходует arduino?
     
  7. NR55RU

    NR55RU Гик

    Все функции входящие стандартные библиотеки С/С++ как правило хорошо и эффективно написаны.
    В вашем случае на тему производительности не стоит беспокоится, так как оптимизацию лучше делать тогда когда она действительно нужна, иногда преждевременная оптимизация может лишь навредить.

    В целом "прямой" парсинг четко известных данных будет всегда эффективнее нежели универсальные функции которые много чего проверяют и делают, но тут появляются свои проблемы как очень узкоспециализированности такого кода как и безопасности с багами, стандартные проверенны вдоль и поперек и о всех их подводных камнях как правило известно.

    Используйте стандартные, а когда решите что вам требуется оптимизация вот тогда уже и стоит искать где "срезать жирок" или наоборот "нарастить машцы" :)
     
  8. AlexVS

    AlexVS Гик

    Есть строка, в теле которой содержится code="ABC". На месте "ABC" могут быть любые буквенные символы. Как в Си задается маска для поиска?
    Пробую
    Код (Text):
    const char maska[] = "code=\"???";
    Но мне кажется что это не работает.
     
  9. geher

    geher Гуру

    Насколько я понимаю, в стандартных библиотеках для ардуино таких готовых функций нет.
    Придется реализовывать самому.
     
  10. AlexVS

    AlexVS Гик

    А в коде чуть выше
    Код (Text):
    "%[a-z]=%i"
    это не то?
     
  11. geher

    geher Гуру

    Во-первых, данный вариант требует после еще проверки значения первой части. Т.е. о готовой функции говорить не приходится.
    Во-вторых, поиск по маске должен искать не просто абстрактную строку, а конкретно code, результатом поиска является не целое, а строка, и я не уверен, что sscanf переварит что-то вроде "code=\"%3s\""?
    В третьих, а если строка не строго длиной 3 символа, а произвольной длины и с произвольным набором символов?
    sscanf, конечно, мощный инструмент, но несколько ограниченный.