Mit char Arrays bekommst Du das so nicht hin. Die können auch nicht „unbestimmt“ sein.
Vielleicht hilft Dir das hier weiter:
Bedenke aber, dass die Nutzung von String, gerade bei wenig Speicher, problematisch sein kann (Stichwort Speicherfragmentierung). Es ist empfehlenswert sich Gedanken über den maximalen Speicherplatz der Strings zu machen und reserve() zu verwenden.
Für sowas verwende ich gerne snprintf, weil man damit nicht nur Zeichenketten zusammenfügen kann, sondern auch Zahlen formatiert bekommt. Etwas Einarbeitung ist wegen der vielen Möglichkeiten allerdings unerläßlich.
Beim Funktionsaufruf geht die Länge verloren, weshalb sizeof(t1) nicht funktioniert. Bei einer Zeichenkette kann das mit strlen(t1) aufgefangen werden.
EDIT: " + 4" geändert in " + 1", weil '\0` nur einmal gebraucht wird.
Hallo,
nein, die Länge ist nicht bekannt. Ich steuere damit WLED über meine Haussteuerung.
Der Temp1 ist der Lampenname und Temp2 der Befehl. Und dieser kann sehr lange werden...
War blos nen Geschreibsel da hätte noch'n const vor gemußt.
Ich bin grad am rechnen...
text1 ist auf 20 incl. \0 festgelegt. Das Ende wird durch das erste aufkommen von \0 gesetzt.
text2 ist 5 (4+\0)
t3 ist 5 + und t4 6 +.
Macht in Summe: 19+4+5+6+\0 = 35 die ich brauche.
size of gibt mir doch die länge incl. \0 zurück.
Damit bekomme ich 20+5+6+7 = 38
Theoretisch könnte ich für die bufferlänge sogar bei jedem sizeof() 1 abziehen und zum bauen genau nur einmal 1 wieder dazu addieren.
(task: Controller in die Tasche stecken für Codeschnipsel unterwegs testen)
Solcherart dynamischer Arrays auf dem Stack sind nicht ISO C++ Standard kompatibel.
Mit "pedantic" schimpft der Compiler dann.
Auch ist der Stack, z.B. bei FreeRTOS begrenzt, was dann zu Problemen führen kann.
Es ist also irgendwie ok das zu tun, nur nicht unter allen Umständen.
Ja, weil bei der Übergabe eines Zeigers an eine Funktion die Information über die Länge des Feldes verloren geht. Zusammen mit dem Zeiger sollte man also auch die Länge des Feldes (der Struktur, des Objektes ...) mit übergeben. Eigentlich.
Da Zeichenketten mit '\0' abgeschlossen sind, kann man in diesem Fall aber auf eine Längenangabe verzichten. Das macht den Ausgabepuffer buf sogar kleiner:
Start
in setup Länge text1: 20 Länge text2: 5
in Funktion Länge t1: 2 Länge t2: 2 <- stimmt nicht!
Text Start Text Ende buf-Länge: 21
in Funktion Länge t1: 20 Länge t2: 5 <- stimmt!
Text Start Text Ende buf-Länge: 37 <- zu lang!
in Funktion Länge t1: 2 Länge t2: 2 <- stimmt nicht!
Text Neuer Start Text Ende buf-Länge: 27
in Funktion Länge t1: 20 Länge t2: 5 <- stimmt!
Text Neuer Start Text Ende buf-Länge: 37 <- zu lang!