Wert aus zwei arrays in einem neuen String

Hi,

hab folgendes Problem. HAb folgende arrays:

char* Tage = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"};
char* Zeit = {"Morgen", "Mittag", "Abend"};

Jetzt würde ich gerne einen neuen String haben in welchem z.B. "Mittwoch Morgen" drinsteht.

Wie bekommt man das hin.

Danke Mutscheid1

Überlege dir ob du das wirklich in einem String brauchst! Das ist meistens nur bei TFTs/Graphik Displays der Fall. Auf Character LCDs oder Serial ist sowas vollkommen überflüssig. Da macht man einfach mehrmals print()/println()

Ansonsten schaue dir die Standard C String Funktionen an.

const char* tage[] = { "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag" };
const char* zeit[] = { "Morgen", "Mittag", "Abend" };
// ^^ String Literale sind const!!

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

  char buffer[20];    //muss Platz für mindestens maximale Länge + 1 haben!

  for (unsigned int i = 0; i < sizeof(tage) / sizeof(tage[0]); i++)
  {
    for (unsigned int j = 0; j < sizeof(zeit) / sizeof(zeit[0]); j++)
    {
      buffer[0] = '\0';    //String gleich am Anfang terminieren
      strcat(buffer, tage[i]);     //strcat = string concatenation
      strcat(buffer, " ");
      strcat(buffer, zeit[j]);

      Serial.println(buffer);
    }
  }
}

void loop()
{
}

Wichtig ist dass man am Anfang buffer[0] = ‘\0’ macht. Damit wird der Puffer nicht wirklich gelöscht, aber die String Funktionen schauen alle auf den Null-Terminator um zu sehen wo der String aufhört. Ansonsten hängt man den String immer wieder hinten an was praktisch sofort zu einem Puffer-Überlauf führt.

Hab mich vielleicht falsch ausgedrückt. Kenne mich noch nicht so aus. Das Ergbenis soll auch vom Typ Char sein.
So kenne ich das. Ich möchte aber nicht alles mischen, sondern explizit aus jedem einen Wert auwählen und in einem neuen Char speichern.

Sieh das dann so aus?

      buffer[0] = '\0';    //String gleich am Anfang terminieren
      strcat(buffer, tage[3]);     //strcat = string concatenation
      strcat(buffer, " ");
      strcat(buffer, zeit[1]);

Ergebnis: Donnerstag Mittag???

So hab ich das in einem Emulator schon probiert. KAnn es an dem Emulator liegen, dass es nicht funktioniert hat?

Lade dir mal den Code auf deinen Arduino und öffne den Serial Monitor. Das macht genau was du willst.

Die for-Schleifen sind nur dazu da dass man alle Kombinationen durchtestet. Ansonsten ist das relevante hier:

char buffer[20];   //Puffer ausreichender Größe anlegen
buffer[0] = '\0';   //Terminator setzen

strcat(buffer, tage[i]);    //ersten String einfügen
strcat(buffer, " ");          //Leerzeichen anhängen
strcat(buffer, zeit[j]);     //zweiten String anhängen

Und statt i und j kannst du natürlich auch feste Indizes einsetzen

Allerdings solltest du lernen dass du hier mit Arrays arbeitest! char und char sind zwei völlig verschiedene Dinge.

Aber nur weil du denkst du brauchst das in einem Array, muss das nicht unbedingt so sein. Das heißt nicht dass es falsch ist.

Jetzt kommen wir so langsam näher. Meine Zeit des Programmieren ist leider schon 10 Jahre her, damals in Vb.NEt.

Char ist ein Array?!
Char ist ein Datentyp, in welchem Buchstaben und Zeichen gespeichert werden können?!

char ist ein Vorzeichen-behaftetes Byte. Hier wird es verwendet um ASCII Zeichen zu speichern. char ist ein Array aus char.

Was du am Anfang hast sind Arrays aus char*. Also Arrays aus Zeiger auf char. Das liegt daran, dass Array Variablen in C zu Zeigern auf das erste Element zerfallen (also tage ist das im Prinzip &tage[0]. & = Adresse von). Und "..." ist letztlich auch nur ein char Array konstanter Größe. Was abgespeichert wird sind die Adressen der Strings.

Insgesamt sind Strings in C ganz primitiv. Das sind lediglich Arrays aus char die mit einem 0/NULL/'\0' terminiert werden. Das Endzeichen ist zwingend nötig um das Ende des Strings zu markieren, und eine beliebte Fehlerquelle. Das ist der Grund weshalb der Puffer mindestens um eins größer als die Anzahl der sichtbaren Zeichen muss. Das ist auch bei den String Literalen der Fall. "Test" hat die Größe 5. Nicht 4.

strcat() geht dann einfach her und sucht nach dem Null-Terminator und kopiert den neuen String ab der Stelle und terminiert den String wieder. Eine Längenprüfung ob das alles wirklich in den Puffer passt findet nicht statt!

Hast du vielleicht nen Link, wo das noch mal verständlicher erklärt ist?

HAb noch ne Frage:

Geht das?

HAbe dies hier: char text1[5] = {‘a’, ‘b’, ‘c’, ‘d’};

Daraus soll soetwas werden: char text2=“abcd”

Oder wie kann man über eine if-Abfrage vergleichen on text2 gleich text1 ist.

Bei text2 geht ja folgendes: if(text2=“abcd”)

HAbe dies hier: char text1[5] = {'a', 'b', 'c', 'd'};

Daraus soll soetwas werden: char text2="abcd"

Das ist schon das gleiche. Wobei du beim ersten sicherheitshalber noch den Null-Terminator dazuschreiben solltest.

Oder wie kann man über eine if-Abfrage vergleichen on text2 gleich text1 ist.

Bei text2 geht ja folgendes: if(text2="abcd")

Dass das bei text2 geht liegt nur daran dass eine Art String-Pooling statt findet und die somit der gleiche Text im RAM verwendet wird. Genaugenomen ist es aber falsch. Verlasse dich nicht auf sowas.

C Strings werden mit der Funktion strcmp() (string compare) verglichen:
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/011_c_arrays_013.htm#mjd148b11ca58a4e84fc80121d3c99dbdf
http://www.cplusplus.com/reference/cstring/strcmp/

Liefert bei Gleichheit 0:

if (strcmp(text1, text2) == 0)
{
}