Char mit String zusammenführen

Hallo,
ich hoffe mir kann jemand bei dem kleinen problem helfen....
ich habe folgende zeile am anfang
char *xvariablex = "Test 12345 - ";

in einer funktion möchte ich
xvariablex = xvariablex + WiFi.macAddress();
zusammenführen damit ich diese weiterverwenden kann

lg
ich hoffe es kann mir jemand bitte bei dieser kleinen frage helfen :slight_smile:

Das gibt einen Speicherbereich der konstant ist und eine feste Länge hat. Für's anhängen mußt Du einen weiteren Speicherbereich ausreichender Größe bereitstellen und beide Teile dort hineinkopieren. Besser wäre
char xvariablex[maxLen] = "Test 12345 - ";
das Platz für maxLen änderbare Zeichen bereitstellt.

1 Like

Sie können einen cString oder die String-Klasse verwenden.

const char* var1 = "abc";
const char* var2 = "123";
char buffer[10]; // die Größe muss groß genug für den Inhalt sein plus ein Byte für ein abschließendes Nullzeichen
…
strncpy(buffer, var1, sizeof buffer);
strncat(buffer, var2, sizeof buffer);
buffer[sizeof buffer - 1] = ‘\0`; // Stellen Sie sicher, dass der cString nullterminiert ist

Oder

const String var1 = "abc";
const String var2 = "123";
String buffer;
…
buffer.reserve(10);
buffer = var1;
buffer += var2;

Seien Sie sehr vorsichtig mit dem Speicher und einem möglichen Überlauf mit cStrings. Strings können auch versteckte Nachteile haben.

Aber Die eigentliche Frage, die Sie sich stellen müssen, ist, brauchen Sie wirklich eine neue Variable mit der Verkettung der anderen? was haben Sie damit vor?

Zunächst stellen sich die Fragen

  • auf welcher Hardware bist Du aktiv?
  • welchen Typ hat WiFi.macAddress()?

Für meinen ESP32 finde ich in c:...\esp32\hardware\esp32\1.0.6\libraries\WiFi\src\WiFiSTA.h String macAddress();, also ein String-Objekt.

Auf einem ESP32 würde ich dann auch mit String weitermachen:

  String xvariable_S = "Test 12345 - ";
  xvariable_S = xvariable_S + WiFi.macAddress();
  Serial.println(xvariable_S);

Für C-Strings wurden Dir schon Vorschläge gemacht, mein Favorit ist allerdings snprintf:

  char xvariable_c[35];
  snprintf(xvariable_c, sizeof(xvariable_c), "Test 12345 - %s", WiFi.macAddress().c_str());
  Serial.println(xvariable_c);

Ja

Aber Wenn Sie die Klasse String verwenden, gibt es keinen wirklichen Grund, sich für sprintf() zu entscheiden. das macht Sinn, wenn Sie cStrings haben (obwohl es mehr zur Flash-Nutzung beiträgt als strcpy() und strcat(), daher die Verwendung im Beispiel).

Es geht aber auch einzeln:

  const char* xvariablex = "Test 12345 - ";
...
  Serial.print(xvariablex);
  Serial.println(WiFi.macAddress());

Dann wird alles im Ausgabepuffer von Serial zusammengefügt.

Leider verstehe ich Ihren Beitrag nicht. Was wollen Sie mir sagen?

Oder in einer Zeile (ESP32):

Serial.printf("Test 12345 - %s", WiFi.macAddress().c_str());

Aber "damit ich diese weiterverwenden kann" deutet in eine andere Richtung.

Wie so häufig fehlen präzise Angaben, um zielgerichtet antworten zu können, weil der Fragesteller relavante Informationen für unwichtig erachtet.

Warten wir mal ab :slightly_smiling_face:

Hallo guten Morgen :slightly_smiling_face:
Können Sie das etwas ausführlicher erklären bitte?
Ich bin auch Anfänger und würde das gern genauer verstehen :thinking:

Danke vielmals !

Hallo

Ich gab ein Beispiel in #3

Danke das habe ich gesehen aber ich verstehe diese Erklärung nicht:

Was heißt das genau? sprintf nur bei cStrings warum?
„..mehr zur Flash Nutzung beitragen“ ist doch gut, oder?

lies noch mal GANZ GENAU.

J-M-L hat im Beitrag #3

strncpy und strncat

verwendet. Die brauchen etwas mehr Programmspeicher (flash) als strcpy und strcat.
"Sie tragen mehr zu Flash Nutzung bei" kannst du positiv oder negativ lesen.

sprintf wird noch mehr Speicher brauchen.

die Arduino String Klasse vermutlich noch mehr.

Das kannst du aber alles selber ausprobieren in dem du drei kompilierbare Sketche machst und vergleichst was der Compiler meldet.

Probier das mal aus. Du willst ja besser verstehen.

Wenn du weiter Fragen dazu hast, dann empfehle ich: ersuche einen Moderator deine Fragen von diesem Thread abzulösen. Denn all deine Fragen, tragen nichts zur Beantwortung zur Frage vom ursprünglichen Poster bei, der sich seit 26 Tagen hier nicht mehr gemeldet hat.

Ja, Was ich meinte, ist, dass Sie, wenn Sie sich entscheiden, die String-Klasse zur Darstellung Ihrer char data (Zeichenkette ??) zu verwenden, bereits alle Methoden zum Suchen, Teilen, Verketten usw. in der Klasse haben. Also bleib bei der Klasse. Es bringt wenig Nutzen, zur cString-Darstellung zu gehen und cString-Funktionen anzuwenden.

Wenn Sie cStrings verwenden möchten, verwenden Sie sie überall im Code. Dann können Sie strncat oder strlcat für die Verkettung verwenden. Wenn Sie sprintf verwenden, ist es flexibler, aber es kostet Flash-Speicher.

(Mein Deutsch ist etwas beschränkt, um dies auszudrücken ...)

Danke für eure Erklärungen :slightly_smiling_face:

Das kleine n habe ich heute Nacht echt überlesen, sorry!

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