• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Строковая переменная

kvs

New member
Есть строка, между числами пробелы.
"1238 123.45 12.28 1034 132.45 0.328 14.77 66.34 0.884"
Как по индексу считывать нужное число?
 

NeoroN

Member
Вначале найти нужный пробел через цикл и уже от него искать завершающий. Потом взять часть строки между пробелами.
 

kvs

New member
Вначале найти нужный пробел через цикл и уже от него искать завершающий. Потом взять часть строки между пробелами.
Вначале найти нужный пробел через цикл и уже от него искать завершающий. Потом взять часть строки между пробелами.
Я имел ввиду что-то типа функции “strtok”. А так очень…
 

enjoynering

Well-known member
вот вам пример для затравки. дальше все есть в гугл

Код:
/************************************************************************************/
/*
    getHostName()

    Returns host name from URL

    NOTE:
    - for example we have url "yyyyyyy.com:80/ccccccc.mp3"
      then "yyyyyyy.com" will be returned
*/
/************************************************************************************/
String getHostName(String urlAddress)
{
  int16_t position = 0;

  position = urlAddress.indexOf("/");               //search for "/" extension separetion simbol simbol in the url

  if (position > 0)
  {
    urlAddress = urlAddress.substring(0, position); //host name without extension
    position = 0;                                   //clear position
  }

  position = urlAddress.indexOf(":");               //search for ":" port separetion simbol in the url
  if (position > 0)
  {
    urlAddress = urlAddress.substring(0, position); //host name without port number
  }

  return urlAddress;
}
 

Алексей.

Active member
Код:
float *get_float_by_index(const String& text, int index) {
  static float f;
  float *result = 0;
  int pos, start;
  for (start = 0; index >= 0 && start < text.length(); index--) {
    if ((pos = text.indexOf(' ', start)) >= 0) {
      if (index == 0 && pos > start) {
        f = text.substring(start, pos).toFloat();
        result = &f;    
      }
      start = pos + 1;
    } else {
      if (index == 0 && start < text.length() - 1) {
        f = text.substring(start).toFloat();
        result = &f;    
      }
      break;
    }
  }
  return result;
}

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println();
 
  String s = "1238 123.45 12.28 1034 132.45 0.328 14.77 66.34 0.884";
  float* f;
  int index = 0;
  while ((f = get_float_by_index(s, index++)) != 0) {
    Serial.print(index - 1);
    Serial.print(" - ");
    Serial.println(String(*f, 3));
  }
}
output:
0 - 1238.000
1 - 123.450
2 - 12.280
3 - 1034.000
4 - 132.450
5 - 0.328
6 - 14.770
7 - 66.340
8 - 0.884

Язык С под Arduino. Я имел ввиду что-то типа функции “strtok”.
про strtok я просто не вспомнил потому как он немножко не threadsafe :) но тут это совсем не актуально
код получился немножко проще
Код:
#include <string.h>
#include <mem.h>

float *get_float_by_index(const String& text, int index) {
  static float f;
  float *result = 0;
  if (text.length() > 0) {
    char *str = (char*)malloc(text.length() + 1);
    strcpy(str, text.c_str());
    for (char* p = strtok(str," "); p != 0 && index >= 0; p = strtok(0, " "), index--) {
      if (index == 0) {
        f = String(p).toFloat();
        result = &f;
      }     
    }
    free(str);
  }
  return result;
}
 
Последнее редактирование:

nikolz

Well-known member
можно примерно так ,
без явного выделения памяти:
Код:
float *get_float_by_index(const String& text, int index) {
  int begin = 0;   int next = text.length() ;
  while (next>1 ) {
        next=text.indexOf(' ', begin );
       index--;    if (index==0)      return  text.substring(begin,next).toFloat();
      begin=next+1;
      }
return 0;
  }
 
Последнее редактирование:

nikolz

Well-known member
Код:
if (index==0)  return  text.substring(begin,next).toFloat();
                                                                   ^
cannot convert 'float' to 'float*' in return
не понятно как это должно работать?
каким образом преобразовать к указателю значение float расположенное в стеке?
понятие не имею так как не пишу на дурине.
Я же написал "примерно так"
полагаю что спецам по дурине исправить без проблем это место.
можно вернуть строку а потом преобразовать
----------------------------
Код:
string get_strfloat_by_index(const String& text, int index) {
  int begin = 0;   int next = text.length() ;
  while (next>1 ) {
        next=text.indexOf(' ', begin );
       index--;    if (index==0)      return  text.substring(begin,next);
      begin=next+1;
      }
return "";
  }
 
Сверху Снизу