Go Down

Topic: char Frage (Read 633 times) previous topic - next topic

harding

Hallo Ihr,

wer kann mir erklären warum folgendes funktioniert:

char Str1[15] = "arduinoarduino";


aber folgendes nicht:

char Str1[15];
Str1 = "arduinoarduino";


Danke für die Hinweise

Marcus W

Weil du beim ersten Beispiel die Variable erstellst, beim zweiten änderst. Während des Erstellens wird eine Routine aufgerufen, die ein derartiges Befüllen erlaubt, beim Ändern dagegen nicht.

voithian

#2
Jun 02, 2012, 09:53 pm Last Edit: Jun 02, 2012, 09:55 pm by voithian Reason: 1
In C/C++ ist keine direkte Zuweisung einer Zeichenkette (= char-Array) an ein anderes char-Array erlaubt.

Dazu kann man stattdessen
Code: [Select]

char Str1[15];
strcpy (Str1, "arduinoarduino");   // Vorsicht! Keiner und nichts überprüft die Größe des Ziels!!!

nehmen.

Und mit Strings der Klasse "String" funktioniert die Zuweisung mit dem Gleichheitszeichen, weil der Zuweisungsoperator "=' für diese Klasse entsprechend überladen ist.

harding

Hi,

Danke für die Info.

Gibt es jetzt nur ein Problem wenn der neue String länger als das char-Array ist oder auch wenn er kürzer ist?

Dann habe ich da noch eine weitere Frage zu diesem Thema:
Ich möchte eine Funktion schreiben welche ein char-Array zurückk gibt. Wie muss ich die Funktion deklarieren und wie den Aufruf bei Zuweisung an eine Variable?

harding

michael_x

Zur Laufzeit müssen die Texte irgendo im Speicher sein und du willst diesen Platz über einen Namen benutzen.
Und du willst eine Variable, die mal auf einen Text verweist und mal auf einen anderen.

Code: [Select]
static char text1[] = "arduinoUNO";
static char text2[] = "arduinoMEGA";

char* Str1 = text1;
if ( xyz ) Str1 = text2;

Serial.println(Str1);

Dass beide Texte unterschiedlich lang sind, kann dir egal sein.

Du kannst auch eine Funktion schreiben, die dir den passenden Namen liefert:

char* getName()
{
  static char text1[] = "arduinoUNO";
  static char text2[] = "arduinoMEGA";
  if  (xyz) return text2;
  else return text1;
}

harding

Hallo Michael_x

nur noch mal eine Nachfrage ob ich das richtig verstanden habe:

Code: [Select]

char* Str1 = text1;


"Str1" ist nur ein Pointer auf die Adresse des Array von "text1" bzw. dann von "text2"?

und die Funktion
Code: [Select]

char* getName()
{
  static char text1[] = "arduinoUNO";
  static char text2[] = "arduinoMEGA";
  if  (xyz) return text2;
  else return text1;
}

gibt auch nur den Pointer auf den Inhalt des entsprechenden Array "text1" oder "text2" zurück?

Die Funktion
Code: [Select]

strcpy (Str1, "arduinoarduino")

verändert direkt den Inhalt des Array Str1?

fragende Grüße

harding

michael_x

- "Str1" ist ein Pointer auf die Adresse des Array von "text1" bzw. dann von "text2".

-- Str1 oder text1 kann fast gleich verwendet werden:
   z.B. Str1[0] == text1[0] ist der erste Buchstabe.
   strlen(Str1) == strlen(text1)
  nur sizeof() ist unterschiedlich : sizeof(text1) == 11, aber sizeof(Str1) == 2

- getName liefert solch einen Pointer
   char * Str1= getName();
    Hier sind die Variablen text1 bzw. text2 nur innerhalb getName() sichtbar. 

- Die Funktion
   strcpy (Str1, "arduinoarduino")
   verändert direkt den Inhalt des Array auf das Str1 gerade zeigt!
   Hat die gleiche Wirkung wie
   strcpy (text1, "arduinoarduino")
   Schreibt auch nach Belieben über dessen Grenzen hinaus. VORSICHT !!!

-- Um das zu verhindern, kann man
    const char* getName() {  ... } definieren.
   Das gibt eine Fehlermeldung , dass der erste Parameter von strcpy kein const char*  sein darf.

Go Up