Chars / Zusammenfügen

Hey, ich habe schon verschiedene Sachen ausprobiert wie Strcat / + und && aber nichts funktioniert.

Ich möchte zwei oder mehrere Werte aus einem char Array zu einer neuen Variable zusammenfügen

wie

char test[5] = Hallo;
char ausschnitt[3] = test[2] + test[3] + test[4]

serial.println(ausschnitt);

= llo

Dabei habe ich das so versucht:

void setup() {
  // put your setup code here, to run once:
 Serial.begin(115200);
}

void loop() {
 char text[20];
 char zahl[20];
 char Eingabe[] = "Abc455955";

  strcat(text, Eingabe[1]);
  strcat(text, Eingabe[2]);
  strcat(text, Eingabe[3]);
  
  strcat(zahl, Eingabe[4]);
  strcat(zahl, Eingabe[5]);
  strcat(zahl, Eingabe[6]);
  strcat(zahl, Eingabe[7]);
  strcat(zahl, Eingabe[8]);
  strcat(zahl, Eingabe[9]);

  Serial.println(text);
  Serial.println(zahl);
  delay(1000);
}

bekam dann aber in der Console raus:

=l⸮⸮⸮
<+⸮⸮* Hell<⸮=l⸮⸮⸮

Wieso geht bei mir die strcat Funktion nicht? Muss ich noch etwas beachten`?

Hi

Serial.Print erwartet (meines Wissen) einen String, also eine /0 terminierte Zeichenkette.
Sollte hier aber nicht Dein Hauptproblem sein.
Meinem Verständnis nach (und der Infos auf dieser Seite):
c-howto.de strings-verketten
müsste Dein Code zumindest die passenden 'Zeichen' aus dem Text 'zusammen kleben'.

Gibt es ein Beispiel zu diesen ganzen Funktionen, um Zeichenketten zu manipulieren?
(habe die IDE gerade nicht offen, meine aber ganz oben in den Beispielen stünde auch 'String' - vll. einen Blick wert)

MfG

Problem 1:

strcat(zahl, Eingabe[9]);

-->Eingabe[] ist 9 Zeichen lang, das Index beginnt also bei 0 und endet bei 8. Eingabe[9] ergibt also irgendeinen zufälligen Inhalt.

Problem 2:
-->Als Quelle wird ein string bzw. ein Zeiger darauf erwartet, Du gibst ihm lediglich ein char.

Problem 3:
-->Dein Programm funktioniert nicht ansatzweise, setz mal eine Ausgabe ins Setup und beobachte die Konsole. Der Controller startet immer wieder neu, was daran liegt:
strcat() sucht im string text nach dem Ende, also \0, aber genau dieses gibt es nicht. Er wühlt also so lange im Speicher rum, bis es kracht.

Eine Lösungsmöglichkeit wäre:

char test[5] = "Hallo";
char ausschnitt[3];
ausschnitt[0]=test[2];
ausschnitt[1]=test[3];
ausschnitt[2]=test[4];
Serial.println(ausschnitt);
char test[] = "Hallo";
char ausschnitt[4];
ausschnitt[0]=test[2];
ausschnitt[1]=test[3];
ausschnitt[2]=test[4];
ausschnitt[3]=0;
Serial.println(ausschnitt);

Oder besser, eine der string Funktionen...

Uvaginowitsch:
Wieso geht bei mir die strcat Funktion nicht? Muss ich noch etwas beachten`?

  1. Du verwechselst den Inhalt eines Elementes und den Zeiger. Bei strcat ist nur der Zeiger gefragt. Bei char Feldern ist der Feldname auch der Zeiger. Also ist Eingabe[1] der Inhalt, während Eingabe der benötigte Zeiger ist.

  2. Lokale Felder werden nicht automatisch mit Inhalt gefüllt. Der Schrott, der angezeigt wird entspricht dem zufälligen Inhalt des Speichers. Globale Felder werden mit 0 gefüllt.

So geht es mit globalen Feldern:

  char text[20];
  char zahl[20];
  char Eingabe[] = "Abc455955";

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  strncat(text, Eingabe, 3);
  strcat(zahl, Eingabe + 3);

  Serial.println(Eingabe);
  Serial.println(text);
  Serial.println(zahl);
}

void loop() {}

Ausgabe:

Abc455955
Abc
455955

Lokal mit Vorbesetzung:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  char text[20];
  char zahl[20];
  char Eingabe[] = "Abc455955";
  for(byte j=0;j<20;j++)
  {
    text[j]='\0';
    zahl[j]='\0';
  }

  strncat(text, Eingabe, 3);
  strcat(zahl, Eingabe + 3);

  Serial.println(Eingabe);
  Serial.println(text);
  Serial.println(zahl);
}

void loop() {}

Lokal mit individuellem Endecode:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  char text[20];
  char zahl[20];
  char Eingabe[] = "Abc455955";
  
  strncat(text, Eingabe, 3);
  text[3]='\0';
  strcat(zahl, Eingabe + 3);
  zahl[6]='\0';

  Serial.println(Eingabe);
  Serial.println(text);
  Serial.println(zahl);
}

void loop() {}

Quell der Erkenntnis.