Pages: [1]   Go Down
Author Topic: char Frage  (Read 540 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Neuss
Offline Offline
Full Member
***
Karma: 1
Posts: 200
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In C/C++ ist keine direkte Zuweisung einer Zeichenkette (= char-Array) an ein anderes char-Array erlaubt.

Dazu kann man stattdessen
Code:
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.
« Last Edit: June 02, 2012, 02:55:12 pm by voithian » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Online Online
Faraday Member
**
Karma: 56
Posts: 2973
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Michael_x

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

Code:
char* Str1 = text1;

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

und die Funktion
Code:
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:
strcpy (Str1, "arduinoarduino")
verändert direkt den Inhalt des Array Str1?

fragende Grüße

harding
Logged

Germany
Online Online
Faraday Member
**
Karma: 56
Posts: 2973
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

- "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.
Logged

Pages: [1]   Go Up
Jump to: