Teil aus String extrahieren?

Hallo Zusammen,
ich habe folgenden String:
GET /HalloForum HTTP/1.1

Wie extrahiere ich den Part HalloForum unter der Annahme, das dieser Teil sich vom Inhalt und der Länge stetig ändern kann?

Im Prinzip müsste ich nur die ersten 5 und die letzten 9 Zeichen abschneiden.
Wie geht das?

War zu voreilig. Lösung gefunden:
req.substring(5,req.length() -9)

String Objekte sind i. a. R. eine schlechte Idee bei Arduino uC.

Schreib das lieber gleich auf c strings (char array) um.

wie mache ich das? Bzw. welchen Vorteil habe ich dadurch?

Danke :slight_smile:

char *incomingbuffer="#201M22.19<#202M26.19<#203M0<"; // enthält den Text

pos = strstr(incomingbuffer, "#202M");  // nach #202M wird gesucht
    if (pos)
    {
      float temperatur = atof(pos + 5);
          
      Serial.print("Temperatur=");
      Serial.println(temperatur );
    }
    }

oder so ähnlich

Die Vorteile werden sich dir noch erschliessen.

Da könnte ich zwei Methoden vorschlagen.

Die erste benutzt - wie deine Lösung - feste vorgegebene Längen,
die zweite sucht den ersten '/', geht einen weiter, sucht von dort das nächste " HTTP".

Der gefundene Bereich wird in einen Ergebnispuffer kopiert.

char data[] = "GET /HalloForum HTTP/1.1";

const byte maxLen = 32;

char extracted[maxLen + 1];

void setup() {
  Serial.begin(115200);

  byte len = min(strlen(data) - 5 - 9, maxLen);
  memcpy(extracted, data + 5, len);
  extracted[len] = 0;
  printExtracted();

  extracted[0] = 0; // clear old result

  char* anfang = strchr(data, '/');
  if (anfang) {
    anfang++;
    char* dahinter = strstr(anfang, " HTTP");
    if (dahinter) {
      byte len = min(dahinter - anfang, maxLen);
      memcpy(extracted, anfang, len);
      extracted[len] = 0;
    }
  }

  printExtracted();
}
void printExtracted() {
  Serial.print(F("extracted = '"));
  Serial.print(extracted);
  Serial.println(F("'"));
}
void loop() {}
extracted = 'HalloForum'
extracted = 'HalloForum'

oder man sucht dann mit pos = strstr(incomingbuffer, "HTTP/1.1");
und haut temporär eine NULL rein, falls man den ursprünglichen string noch mal btaucht, macht man wieder leer rein. So erspart man sich das kopieren

char *incomingbuffer = "GET /HalloForum/abcdef HTTP/1.1";

void setup() {
  Serial.begin(115200);
  Serial.println(incomingbuffer);
  char* pos = strstr(incomingbuffer, "HTTP/1.1");
  strcpy(pos - 1, 0);
  Serial.println(incomingbuffer);
  pos = strstr(incomingbuffer, "GET") + 4;
  Serial.println(pos);


}

void loop() {}

Stimmt, das ist eine dritte Methode.

  char* pos = strstr(incomingbuffer, "HTTP/1.1");
  strcpy(pos - 1, 0);

Verwenden von pos ohne Test ist böse.

  char* pos = strstr(incomingbuffer, " HTTP/1.1");
  if (pos) {
    strcpy(pos, 0);

Dafür braucht man aber nicht strcpy(). Statt dessen kann man Zeichen direkt über den Zeiger setzen.

Da hast du natürlich Recht.

 char* pos = strstr(incomingbuffer, " HTTP/1.1");
  if (pos) {
    *pos = 0;

Manchmal denkt man halt auf Umwegen. Aber man sollte versuchen, diese Umwege so kurz wie möglich zu halten. :wink:

Vielen Dank an alle!!