Помогите с кодом, распарсить строку

s1981
Offline
Зарегистрирован: 22.12.2013
#define PARAM_DELIMETER "#" // чем разделены у нас параметры
#define NAME_VALUE_DELIMETER "#" // чем разделены у нас имя параметра и значение


int hour;
int minut;

void setup(){
  Serial.begin(9600);
  
  char* inputString="SET TIME #12#20"; // наши тестовые данные
  
  // выводим что собираемся парсить
  Serial.print("input '");Serial.print(inputString);  Serial.println("'");
  
  // парсим
  parseParams(inputString);
 
}


// парсид входящую строку в массив params[] и устанавливает parsedParam в количество прочитанных элементов
void parseParams(char* inputString){
  
  
  char* buffer=strtok(inputString,"#"); // лучше так проверять/пропускать вопросилово
  
  if(buffer!=NULL){ 
    for(buffer=strtok(NULL, NAME_VALUE_DELIMETER); buffer!=NULL;     buffer=strtok(NULL, NAME_VALUE_DELIMETER) )   {
         // парсим порт
         Serial.print("hour=");Serial.println(buffer);
         String h=buffer;
        hour=h.toInt();
        // парсим значение
         if( (buffer=strtok(NULL,PARAM_DELIMETER)) !=NULL)   {
           Serial.print("min=");Serial.println(buffer);
       String m=buffer;  
     minut=m.toInt();  
     }
         else return ; // фигня какая-то, порт есть, а значения нет, прекращаем парсинг
}  
}
Serial.print(hour+minut);
}

void loop(){}

Код работает. Но мне нужно работать с переменной String, а тут Char.

Помогите пожалуиста. Поиск тем по переводу String в Char результатов не дал.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

s1981 пишет:

Код работает. Но мне нужно работать с переменной String, а тут Char.

Помогите пожалуиста. Поиск тем по переводу String в Char результатов не дал.

не понятно, то ли строки в символы, то ли символы в строки тебе нужно.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Метод c_str()

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

kisoft пишет:
Метод c_str()

Вангую ответ ТС: "не понял, куда это пихать" :)))

s1981
Offline
Зарегистрирован: 22.12.2013

Клапауций 322 пишет:

s1981 пишет:

Код работает. Но мне нужно работать с переменной String, а тут Char.

Помогите пожалуиста. Поиск тем по переводу String в Char результатов не дал.

не понятно, то ли строки в символы, то ли символы в строки тебе нужно.

Мне нужно String перевести в Char

У меня есть String stroka="qwertyui";

нужно Char* stroka="qwertyui";

Araris
Offline
Зарегистрирован: 09.11.2012
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

s1981 пишет:

Мне нужно String перевести в Char

У меня есть String stroka="qwertyui";

нужно Char* stroka="qwertyui";

String stroka="qwertyui";

const char* UkazatelNaStroka = stroka.c_str();

Если не надо менять исходную строку, а только анализировать.

 

s1981
Offline
Зарегистрирован: 22.12.2013

DIYMan пишет:

s1981 пишет:

Мне нужно String перевести в Char

У меня есть String stroka="qwertyui";

нужно Char* stroka="qwertyui";

String stroka="qwertyui";

const char* UkazatelNaStroka = stroka.c_str();

Если не надо менять исходную строку, а только анализировать.

 

Спасибо за ответ но не работает

#define PARAM_DELIMETER "#" // чем разделены у нас параметры
#define NAME_VALUE_DELIMETER "#" // чем разделены у нас имя параметра и значение


int hour;
int minut;

void setup(){
  Serial.begin(9600);
  String stroka ="h ttp://192.168.3.5/?2:1,15:0,11:2SETTIME#12#6";
  const char* inputString=stroka.c_str();
  
  // выводим что собираемся парсить
  Serial.print("input '");Serial.print(inputString);  Serial.println("'");
  
  // парсим
  parseParams(inputString);
  

  
}


// парсид входящую строку в массив params[] и устанавливает parsedParam в количество прочитанных элементов
void parseParams(char* inputString){
  
  
  char* buffer=strtok(inputString,"#"); // лучше так проверять/пропускать вопросилово
  
  if(buffer!=NULL){ 
    for(buffer=strtok(NULL, NAME_VALUE_DELIMETER); buffer!=NULL;     buffer=strtok(NULL, NAME_VALUE_DELIMETER) )   {
         // парсим порт
         Serial.print("hour=");Serial.println(buffer);
         String h=buffer;
        hour=h.toInt();
        // парсим значение
         if( (buffer=strtok(NULL,PARAM_DELIMETER)) !=NULL)   {
           Serial.print("min=");Serial.println(buffer);
       String m=buffer;  
     minut=m.toInt();  
     }
         else return ; // фигня какая-то, порт есть, а значения нет, прекращаем парсинг
}  
}
Serial.print(hour+minut);
}

void loop(){}

 

s1981
Offline
Зарегистрирован: 22.12.2013

Araris пишет:

String.toCharArray() ?

 http://arduino.ua/ru/prog/StringToCharArray

String stroka="h ttp://192.168.3.5/?2:1,15:0,11:2SETTIME#12#6"; // наши тестовые данные
  char* stroka2;
  stroka.toCharArray(stroka2,10);

Так получается пусто....

Araris
Offline
Зарегистрирован: 09.11.2012

char stroka2[10]; // А так ?

s1981
Offline
Зарегистрирован: 22.12.2013

Araris пишет:

char stroka2[10]; // А так ?

Так работает, большое спасибо

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

s1981 пишет:

DIYMan пишет:

s1981 пишет:

Мне нужно String перевести в Char

У меня есть String stroka="qwertyui";

нужно Char* stroka="qwertyui";

String stroka="qwertyui";

const char* UkazatelNaStroka = stroka.c_str();

Если не надо менять исходную строку, а только анализировать.

 

Спасибо за ответ но не работает

А и не будет работать, если не умеете читать, во-первых, документацию к использованным функциям, и, во-вторых то, что вам пишут. Вы используете strtok, а я ведь ясно написал: c_str() - это когда исходную строку менять не надо. strtok меняет строку, переданную в параметре, c_str() - возвращает константный указатель на строку, следовательно всё, что лежит по этому указателю - запрещено к изменению: компилятор по ручкам настучит.

Ну ей богу - надо же иногда хоть почитать инструкцию. Я понимаю, что это не модно - но без этого - никак.