Frage zu char string

Hallo,
ich hätte einmal eine kleine Frage an die C-Progger unter euch.

Bsp.:

void setup() {
Serial.begin(9600);
char *feldZK[]={"Zeichenkette 1",
  "Zeichenkette 2",
  "Zeichenkette 3"
  };
Serial.print(kette2);
}
void loop() {}

Fragen:
Meine C-Bücher sagen nichts darüber, wie man nun auf die Elemente (=Zeichenketten) zugreifen kann. Wie ändere ich also den ersten Buchstaben des ersten strings von Z zu T?

Wie ist das mit dem Speicherplatz? Wenn ich den ersten String ändere und die Änderung länger ist als “Zeichenkette 1”, gibt es dann einen overflow?

1.

 feldZK[0][0] = 'T';

oder

 *feldZK[0] = 'T';

oder

 **feldZK = 'T';
  1. Ja.

IO_HYBRIS_OI: Meine C-Bücher sagen nichts darüber, wie man nun auf die Elemente (=Zeichenketten) zugreifen kann.

Das Kapitel über Arrays (mehrdimensionale bzw. Arrays von Pointern) fehlt?

IO_HYBRIS_OI: ich hätte einmal eine kleine Frage an die C-Progger unter euch.

Wird jetzt hier Slang gesprochen?

Wie ist das mit dem Speicherplatz? Wenn ich den ersten String ändere …

wie willst du das denn machen? So :

void setup() {
char *feldZK[]={"Zeichenkette 1",
  "Zeichenkette 2",
  "Zeichenkette 3"
  };
Serial.println(feldZK[0]); // Ausgabe: "Zeichenkette 1"
feldZK[0] = "Ein gaaaaaanz langer Text";
Serial.println(feldZK[0]); // Ausgabe:  "Ein gaaaaaanz langer Text"
}

Du hast 4 Texte im RAM ( permanent ), die normalerweise eigentlich gar nicht geändert werden sollten (s.u.).
Und du hast 3 Zeiger. feldZK[0] wird geändert. Danach ist der erste Text zwar noch im RAM, du kommst aber nicht mehr dran.

*feldZK[1] = 'X';  // verändert das Z von "Zeichenkette 2" in ein X. Wenn du das wirklich willst...
feldZK[1][0] = 'T'; // dasselbe in anderer Schreibweise: Das 'X' wird durch ein 'T' ersetzt.
feldZK[1][5] = 0; // Endekennung 
Serial.println(feldZK[1]); // Ausgabe: "Teich"
feldZK[1][100] = 'X'; // schreibt irgendwo in den RAM. Was dann passiert, ist undefiniert.

Serial.print(kette2);

Wenn du was postest, wäre es schön, wenn es wenigstens kompilieren würde.

Wie ändere ich also den ersten Buchstaben des ersten strings von Z zu T?

Am besten gar nicht. Arrays aus Strings dieser Art sind eher für konstante Strings geeignet.

@Whandall: Entschuldige den Slang, aber ich denke, dass dies verständlich und für ein Internetforum hinreichend ist. So scheiden sich die Geister... Und nein. Ich habe gerade das Buch von Jürgen Wolf (C Programmierung) vor mir und hierin ist besagtes nicht. Ich schaue morgen mal in der Bib nach einem anderen C Buch. (Empfehlungen?)

Danke an alle und eine letzte Frage: Welche Art von Strings wäre denn für solche Operationen geeignet?

IO_HYBRIS_OI: Und nein. Ich habe gerade das Buch von Jürgen Wolf (C Programmierung) vor mir und hierin ist besagtes nicht.

Schaue mal in Kapitel 9, Seite 174 "Arrays und Strings", da sollte doch was zu finden sein.

Zeiger auf Zeiger wohl erst im nächsten Buch C von A bis Z von Jürgen Wolf.

Welche Art von Strings wäre denn für solche Operationen geeignet?

1.) Zwei-dimensionale Arrays. Dann haben aber alle Strings die gleiche maximale Länge und auch kürzere Strings belegen den gleichen Speicher wie lange. Für manche Anwendungen ist das aber perfekt.

2.) Wenn sich die Länge der Strings signifikant unterscheidet, dann erst mal einzelne Arrays für alle Strings anlegen. Und dann ein extra Array aus Zeigern auf diese Strings (also ein ein Array von char*). Jeder der Zeiger belegt dann 2 Bytes.

Wie du es machen wolltest ginge theoretisch schon, aber das heißt nicht dass es eine gute Idee ist. C/C++ erlaubt mit Zeigern halt auch viel Unsinn. Der zweite Punkt ist nicht viel anders, aber es ist sauberer weil tatsächlich Speicher per Hand angelegt wurde.