парсинг строки

Тема в разделе "Arduino & Shields", создана пользователем zsm, 8 янв 2014.

  1. Megakoteyka

    Megakoteyka Оракул Модератор

    Набросал в VisualStudio, под Arduino сами переделаете :)
    Код (Text):
    #include "stdafx.h"
    #include <stdlib.h>

    int _tmain(int argc, _TCHAR* argv[])
    {
        char inputString[] = "42,50,0\n43,51,1\n44,52,2\n";// исходный "поток символов"
        int values[3];// массив для хранения распарсенных чисел
        char part[4];// чтобы влезло максимальное число - "100" + символ конца строки '\0'

        char* pStr = inputString;
        int valueIndex = 0;
        int symbolIndex = 0;

        while(*pStr != '\0')
        {
            // имитируем Serial.read()
            char c = *pStr;

            if(c == '\n' || c == ',')
            {
                part[symbolIndex] = '\0';
                values[valueIndex] = atoi(part);
             
                if(c == '\n')
                {
                    valueIndex = 0;
                    for(int i = 0; i < 3; i++)
                        printf("%d ", values);
                    printf("\n");
                }
                else
                {
                    valueIndex++;
                }

                symbolIndex = 0;
            }
            else
            {
                part[symbolIndex++] = c;
            }

            pStr++;// пошли на следующий символ
        }

        return 0;
    }
    На первом курсе универа нас на программировании заставляли заниматься одной полезной вещью:
    рисовать на листочке табличку, где в заголовках колонок были названия переменных, а в заголовках строк - номер итерации. Берешь такую табличку, идешь по коду с карандашиком и вписываешь значения переменных в таблицу на каждом шаге. Очень здорово помогало понять логику выполнения кода. Попробуйте на досуге :)
     
    zsm нравится это.
  2. zsm

    zsm Гик

    Большое спасибо , обязательно попробую.
     
  3. zsm

    zsm Гик

    Смотрю на код как баран на новые ворота:D , даже не понимаю где тут переменные куда значения команд запишутся... а от int _tmain(int argc, _TCHAR* argv[]) страшно просто становится :) (не только мне,но и arduino при компиляции ругается)
    ушел учить мат часть:confused:
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Вот так попробуйте
    Код (Text):
    int values[3];// массив для хранения распарсенных чисел
    char part[4];// массив для собирания в него кусочков строки типа "12,34,56\n"
    int valueIndex = 0;// номер очередного кусочка строки
    int symbolIndex = 0;// номер очередного символа очередного кусочка строки

    void setup()
    {
    }

    void loop()
    {
      int x;
      int y;
      int z;
     
      if(DataReady())
      {
        // данные обновились, можно их использовать
        x = values[0];
        y = values[1];
        z = values[2];  
      }
    }

    // функция возвращает true, если принята и распарсена очередная строка типа "12,34,56\n"
    boolean DataReady()
    {
      if(!Serial.available())
        return false;
     
      char c = Serial.read();
      if((c != '\n') && (c != ','))
      {
        part[symbolIndex++] = c;
      }
      else
      {
        part[symbolIndex] = '\0';
        values[valueIndex] = atoi(part);  
        if(c == '\n')
        {
          symbolIndex = 0;
          valueIndex = 0;
          return true;
        }
        else
        {
          valueIndex++;
          symbolIndex = 0;
          return false;
        }
      }
    }
     
    zsm нравится это.
  5. zsm

    zsm Гик

    Огромное спасибо, все заработало как надо:D. теперь буду разбираться как это всё работает:)
    Вообще тема очень полезная для новичков получилась.
     
  6. Alexey0027

    Alexey0027 Нуб

    Добрый день, мне конечно в программе понятно многое , но меня вводит в ступор char *str = inputString;
    правильно ли я понимаю , когда мы пишем str++, уже без * мы инкрементируем счетчик указателя на элемент массива *str , и в общем то char *str = inputString; это тоже самое если бы мы написали
    char str[7] ="L,2,5,5,R,1,9,0\r" и командой per1=str[0]; вызвали бы нулевой элемент массива "L", так?
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Все верно, это просто 2 различные формы записи одной и той же операции.
    Выражение pointer[x] означает буквально "к указателю pointer прибавить X раз размер этого указателя и взять элемент, находящийся по получившемуся адресу" и именно таким образом выполняется.
     
    zsm и Alexey0027 нравится это.
  8. Alexey0027

    Alexey0027 Нуб

    Ок , спасибо !!! Разрешите консультироваться если вопросы возникнут ?
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Для этого мы все тут и находимся - чтобы делиться опытом и помогать друг другу :)