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
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
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.
In C/C++ ist keine direkte Zuweisung einer Zeichenkette (= char-Array) an ein anderes char-Array erlaubt.
Dazu kann man stattdessen
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.
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
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.
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;
}
Hallo Michael_x
nur noch mal eine Nachfrage ob ich das richtig verstanden habe:
char* Str1 = text1;
"Str1" ist nur ein Pointer auf die Adresse des Array von "text1" bzw. dann von "text2"?
und die Funktion
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
strcpy (Str1, "arduinoarduino")
verändert direkt den Inhalt des Array Str1?
fragende Grüße
harding
-- 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
char * Str1= getName();
Hier sind die Variablen text1 bzw. text2 nur innerhalb getName() sichtbar.
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.