streng.h sscanf

kozusev
Offline
Зарегистрирован: 30.10.2012

Всем привет!

Прошу помочь разобрать строку. <Idle,MPos:100.000,20.000,20.000,WPos:100.000,20.000,20.000>

Загяню в буфер типа масива CHAR и потом разбтваю на части и вывожу в сериал
    sscanf(buffer, "%[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^>]", &STATUS, &MPOSX, &MPOSY, &MPOSZ, &WPOSX, &WPOSY, &WPOSZ);

но как только ввожу (читать до ":") нифига нормально не выводит

sscanf(buffer, "%[^,], %[^':'], %[^,], %[^,], %[^,], %[^':'], %[^,], %[^,], %[^>]", &STATUS, &STRING1, &MPOSX, &MPOSY, &MPOSZ, &STRING2, &WPOSX, &WPOSY, &WPOSZ);

перебрал все варианты и всё ничего

Подскажите кто имел дело с sscanf

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

Не люблю sscanf, но почему бы не попробовать двоеточие без апострофов?

kozusev
Offline
Зарегистрирован: 30.10.2012

Пробовал и без апострофов и с ними. Буду наверное пробовать использовать substring. 

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

Как вариант, strtok, или лучше strchr

tsostik
Offline
Зарегистрирован: 28.02.2013

Если читать "любое количество символов кроме двоеточия", то логично в формате после этого двоеточие обработать:

sscanf(buffer, "%[^,], %[^:]:%[^,], %[^,], %[^,], %[^:]:%[^,], %[^,], %[^>]", &STATUS, &STRING1, &MPOSX, &MPOSY, &MPOSZ, &STRING2, &WPOSX, &WPOSY, &WPOSZ);

 

kozusev
Offline
Зарегистрирован: 30.10.2012

tsostik пишет:

Если читать "любое количество символов кроме двоеточия", то логично в формате после этого двоеточие обработать:

sscanf(buffer, "%[^,], %[^:]:%[^,], %[^,], %[^,], %[^:]:%[^,], %[^,], %[^>]", &STATUS, &STRING1, &MPOSX, &MPOSY, &MPOSZ, &STRING2, &WPOSX, &WPOSY, &WPOSZ);

 

Большое спасибо. РАБОТАЕТ!!! 

Может ещё подскажите где можно прочить про синтаксис этой и друких функций?

kozusev
Offline
Зарегистрирован: 30.10.2012

tsostik пишет:

Если читать "любое количество символов кроме двоеточия", то логично в формате после этого двоеточие обработать:

sscanf(buffer, "%[^,], %[^:]:%[^,], %[^,], %[^,], %[^:]:%[^,], %[^,], %[^>]", &STATUS, &STRING1, &MPOSX, &MPOSY, &MPOSZ, &STRING2, &WPOSX, &WPOSY, &WPOSZ);

 

Большое спасибо. РАБОТАЕТ!!! 

Может ещё подскажите где можно прочить про синтаксис этой и друких функций?

tsostik
Offline
Зарегистрирован: 28.02.2013

http://www.cplusplus.com/reference/cstdio/scanf/?kw=scanf

Вообще, крайне полезный сайт.

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

wgaint
Offline
Зарегистрирован: 15.03.2015

чето я застрял...
Модуль esp8266 на Leonardo

Получаю от сервера ответ на GET вида:
key:200,120

Числа могут быть разные. Дальше парсинг чтобы достать цифры 200 и 120:

  if (Serial1.find("key")) 
  { 
    for (int i = 0; i < 10; i++) 
    {
      if (Serial1.available())  //new cahracters received?
      {
        char c = Serial1.read(); //print to console
        Serial.write(c); //В ТЕРМИНАЛЕ ":200,120"
        unit_in[i] = c;
      }
      else i--;  //if not, keep going round loop until we've got all the characters
    
    }
    
    sscanf(unit_in,":%i,%i",&temp,&timer);  
    
    Serial.print(temp);
    Serial.print(timer); 
}
// в терминале вижу
200
120
Поскольку 120 - это время в секундах, дальше умножаю на 1000 и получаю 54464
 
В чем прикол?
     
 
 
achuser
Offline
Зарегистрирован: 02.03.2013

Приветствую.  Не могу заставить корректно работать разборку строки, char/int переменные пробовал, то 1 символ пропстит, то вообще лажу всякую выдает...

 

void loop(void){
 
 int i=0;
  char buffer[9];
 
//если есть данные - считаем их
  if(Serial.available()){
     delay(100);
 
//сохраним прочитанное в буфер
     while( Serial.available() && i< 8) { buffer[i++] = Serial.read(); } //закрываем массив buffer[i++]='\0'; } //если вдруг буфер наполнен if(i>0){  
 
//разобьем его на части, отделенные запятой
    sscanf(buffer, "%[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,]", &ID, &S1, &S2, &S3, &S4, &S5, &S6, &T1, &U1);
   //while(i>0 &&  i< 8 ){   buffer[i++]='\0'; }
 Serial.println(ID);
 Serial.println(S1);
 Serial.println(S2);
 Serial.println(S3);
 Serial.println(S4);
 Serial.println(S5);
 Serial.println(S6);
 Serial.println(T1);
 Serial.println(U1);

 

 

в чем может быть косяк?

 

achuser
Offline
Зарегистрирован: 02.03.2013

Увеличил буфер для переменных на 1 знак, стало норм работать, видимо, запятые туда же загонялись

...

  char ID[4];
  char S1[4];
  char S2[4];
 
...
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

achuser пишет:

в чем может быть косяк?

Для начала в том, что код неполный и вставлен не по правилам.