[gelöst] Problem beim Teilen eines langen Strings

Hallo Leute,

ich steh hier vor einem Problem, wie "der Ochse vorm Berg"

Ich finde irgendwie gerade den Ansatz nicht zur Lösung einer Einfachen Aufgabe. Ich weiß es ist mit einer erweiterten Splittung möglich, aber das wie ist mein Problem.

Folgende Aufgabe habe ich mir gestellt.

Es gibt eine Variable, mit veränderbarer Anzahl an Wörtern und dadurch auch veränderbarer Länge der Einzelnen Wörter.

Der String könnte in etwa so aussehen:

String Text = "Das - kann - doch - nicht - so - schwer - sein"

oder so:

String Text = "Ich - komme - irgendwie - nicht - auf - die - Lösung"

Ziel ist es, den String in 2 Strings zu teilen, und zwar hinter einem Bindestrich.

Der 1. String darf aber nicht länger wie 22 Zeichen sein.

Hoffe mir kann da jemand auf die Spur bringen.

Ob ein StringObject für Dich geeignet ist, wäre zu prüfen, aber möglicherweise bringt Dich indexOf() in Verbindung mit substring() auf eine Idee.

Deine Frage ist allerdings so formuliert, als würdest Du nach strtok suchen.

Hallo agmue,

danke für die schnelle reaktion.

Meine Kenntnisse sind leider noch sehr begrenzt, hängt wohl auch damit zusammen, dass ich aus Zeitlichen Gründen mich zu wenig mit dem Thema beschäftigen kann.

Welcher der Richtige Weg ist, da komme ich einfach nicht drauf.

Mein erster Gedanke war den String zu Splitten, da kam ich dann aber schon an meine Grenzen, da ja die Anzahl der Wörter Variable ist. Dann müsste ich ja alle gesplitteten Wörter wieder so zusammensetzen (in der gleichen Reihenfolge), dass inkl. dem Bindestrich zw. den einzelnen Wörtern die 1. Zeile nicht länger als 22 Zeichen ist. Also die Anzahl der Wörter in der 1. Zeile auch variieren kann.

Das sind so viele Anforderungen, da dreht sich gerade alles in meinem Kopf.


String Text = "Das - kann - doch - nicht - so - schwer - sein";
int startZeichen;
int nextZeichen;
const uint8_t trennung=22;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  startZeichen = Text.indexOf('-');
  if (startZeichen != -1)
  {
    while (startZeichen + nextZeichen < trennung && nextZeichen != -1)
    {
      nextZeichen = Text.indexOf('-', startZeichen + 1);
     if (nextZeichen < trennung && nextZeichen != -1)
      {
        startZeichen = nextZeichen;
        nextZeichen = 0;
        Serial.println(startZeichen);
      }
    }
  }
  Serial.println(Text.substring(0,startZeichen+1));
  Serial.println(Text.substring(startZeichen+1));
}
void loop()
{
}

Du trennst doch nicht nach Worten, sondern nach Bindestrichen.
Deine Aufgabe verstehe ich so, dass du bis Pos 22 die '-' Zeichen suchst, und nach dem letzten trennen willst.
Ich würde es mit char [] machen, meine Aufgabe so ändern, dass das trennende '-' durch eine '\0' ersetzt wird, und hätte so zwei Texte, ohne sie umkopieren zu müssen, (RAM sparend macht die Aufgabe erst Arduino-relevant)

Aber String Objekte können das sicher auch, wie @my_xy_projekt gespoilert hat.

Vielen Dank für den Hilfreichen Schupser.

Jetzt muss ich nur noch herausfinden warum mein Serial Monitor mir nichts anzeigen will ( ja habe den Monitor auf 115200 umgestellt)

Bitte beschreibe das Problem. Nicht die Schwierigkeiten die du hast deine vermeintliche Lösung umzusetzen.

Was willst du wirklich machen?
Woher kommt der "lange String" in deinem Arduino?
Wohin gehen die kleineren Teile?
Und warum gibt es für den ersten String das Limit von 22 Zeichen - für die anderen nicht?

[quote="noiasca, post:7, topic:1038966, full:true"]

Bitte beschreibe das Problem. Nicht die Schwierigkeiten die du hast deine vermeintliche Lösung umzusetzen.[/quote]

Das Endziel ist eine Anzeige auf einem TFT Bildschirm mit Verschiedenen Texten und in verschiedenen Größen. Der "lange String" ist max. 40 Zeichen lang, in der Zeile wo der Inhalt des String hinsoll habe ich aber nur Platz für 22 Zeichen. Also muß der Rest in die Zeile darunter.

Alle Strings kommen in Zukunft per MQTT in den Arduino, das steht schon soweit.

Der Rest kommt in die 2. Zeile da < 22 Zeichen

Habe nur Platz für 22 Zeichen pro Zeile und der String ist max. 40 Zeichen lang

Welchen Typ hat die Variable in der dein Satz steht?

Verstehe ich das richtig:
Du hast einen Satz mit Wörtern und du möchtest den auf zwei Zeilen a maximal 22 Zeichen aufteilen.
Wörter sollen aber immer als ganzes bestehen bleiben. Du möchtest also einen Zeilenumbruch vor dem Wort das nicht mehr vollständig in die Zeile 1 passen würde haben?

Die Variable hat den Typ String

Genau

Kann mir einer Erklären, warum der Code von @my_xy_projekt mit einem nano funktioniert, aber mit einem ESP32 nicht?

Beim ESP32 bleib der Serial Monitor Leer, beim nano wird alles angezeigt

EDIT: Hat sich erledigt. Der ESP ist zu schnell. Als ich die RESET-Taste auf dem ESP gedrückt habe wurde es mir dann angezeigt

dein ESP32 problem kann ich nicht nachvollziehen, aber ich würde im Sketch vom @my_xy_projekt zwei Zeile anpassen


String Text = "Das kann doch nicht so schwer sein";

int startZeichen;
int nextZeichen;
const uint8_t trennung = 22;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  startZeichen = Text.indexOf(' ');
  if (startZeichen != -1)
  {
    while (startZeichen + nextZeichen < trennung && nextZeichen != -1)
    {
      nextZeichen = Text.indexOf(' ', startZeichen + 1);
      if (nextZeichen <= trennung && nextZeichen != -1)  // imho besser 
      {
        startZeichen = nextZeichen;
        nextZeichen = 0;
        Serial.println(startZeichen);
      }
    }
  }
  Serial.println(F("123456789a123456789b12"));
  Serial.println(Text.substring(0, startZeichen)); // letzten Leerschritt nicht mehr drucken
  Serial.println(Text.substring(startZeichen + 1));
}
void loop()
{
}
Start...
8
13
19
22
123456789a123456789b12
Das kann doch nicht so
schwer sein

Vielen Dank an alle, damit kann ich auf jeden Fall weiter arbeiten. Das ESP "Problem" konnte ich lösen. Der ESP ist einfach zu schnell. Nach einem Druck auf den Reset-Button wurde mir alles angezeigt

Erklärung: Weil jemand gepennt hat. Ich habe Core 2.0.4, es gibt aber schon 2.0.5, ob es da besser ist?

Lösung:

  Serial.begin(115200);
  delay(500);
  Serial.println(F("Start..."));

OK, danke!!!

So geht es!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.