2013-02-16 9 views
11

ich keine Fehlermeldung erhalten, wenn ich schreibezuweisen Wert auf char Array

char a[10] = "Hi"; 

Aber wenn ich es zu folgenden ändern, erhalte ich eine Fehlermeldung: Array type char is not assignable.

char a[10]; 
a = "Hi"; 

Warum ist Typ Array char nicht zuweisbar? Liegt es daran, dass die Sprache absichtlich so geschrieben wird oder fehlt mir ein Punkt?

+0

Für Antworten zu schreiben: Da diese C++ markiert ist, sind gibt es eine * non * -strcpy "mehr C++" Möglichkeit, dies zu tun, während Sie mit 'char []' umgehen? –

+0

Ein "mehr C++ Weg" wäre String oder Vektor anstelle von char [] zu verwenden. Indem du char [] benutzt, akzeptierst du grundsätzlich alle C-ness, die damit einhergehen. – Cogwheel

+0

danke für deine Antwort Jungs. –

Antwort

12

Die C++ Art und Weise, dies zu tun, wie ich oben bemerkte, wären std::string zu verwenden, anstatt char[]. Das gibt Ihnen das Zuordnungsverhalten, das Sie erwarten.

Das heißt, der Grund, warum Sie nur einen Fehler für den zweiten Fall bekommen ist, dass die = in diesen beiden Linien verschiedene Dinge bedeuten:

char a[10] = "Hi"; 
a = "Hi"; 

Die erste ist eine Initialisierung, die zweite eine Zuordnung .

Die erste Zeile weist genügend Platz auf dem Stapel für 10 Zeichen zu und initialisiert die ersten drei Zeichen als 'H', 'i' und '\ 0'. Von diesem Punkt an beziehen sich alle a auf die Position des Arrays auf dem Stapel. Da das Array nur ein Platz auf dem Stack ist, darf a niemals geändert werden. Wenn Sie möchten, dass eine andere Position auf dem Stapel einen anderen Wert enthält, benötigen Sie eine andere Variable.

Die zweite (ungültige) Zeile versucht dagegen, a zu ändern, um auf eine (technisch unterschiedliche) Beschwörung von "Hi" zu verweisen. Das ist aus den oben genannten Gründen nicht erlaubt. Sobald Sie ein initialisiertes Array haben, können Sie nur Werte daraus lesen und Werte darin schreiben. Sie können den Standort oder die Größe nicht ändern. Das würde eine Aufgabe in diesem Fall versuchen.

+1

Hätten Sie etwas dagegen, dass Sie eine '' std :: string' und bekomme das Verhalten das OP will? Ich denke, das wäre eine gute Ergänzung zu einer guten Antwort. – NathanOliver

+1

Ja, normalerweise versuche ich zweistufige Antworten auf Fragen wie diese zu geben (eine direkte, die andere die Absicht dahinter). Da der Fragesteller meinen Kommentar gesehen hatte und dieser Thread als düpiert geschlossen wurde, habe ich mich wohl nicht gestört. – Cogwheel

2

a ist ein Zeiger auf das Array, nicht das Array selbst. Es kann nicht neu zugewiesen werden.

Sie haben mit C++ BTW getaggt. Verwenden Sie für diesen Fall lieber std :: string. Es ist wahrscheinlich mehr, was Sie erwarten.

+1

'a' ist das Array selbst, kein Zeiger auf das Array. Es * kann * implizit in einen Zeiger auf das erste Element umgewandelt werden. –

8

Die Sprache erlaubt keine Zuweisung von Zeichenfolgenliteralen zu Zeichenfeldern. Sie sollten strcpy() statt:

strcpy(a, "Hi"); 
+1

Richtig - für eine Situation wie diese sollten Sie 'strcpy' verwenden. Dich zu vergessen, jemals von 'strncpy' gehört zu haben, wäre wahrscheinlich überhaupt kein Verlust - es ist fast so nutzlos wie' bekommt'. –

+0

Related [Unterschied zwischen 'strcpy' und 'strcpy_s'?] (Http://stackoverflow.com/questions/32136185/difference-between-strcpy-and-strcpy-s) –

16

Ein Array ist kein modifizierbar lvalue

Verwendung

char a[10]; 
strcpy(a, "Hi"); 
0

Einfach, die

char a[10] = "Hi"; 

ist ein kleines "Extra-Feature", wie es zur Laufzeit nicht so gemacht werden kann.

Aber das ist der Grund für C/C++ - Standardbibliotheken.

#include <string.h> 

// ... 
strcpy(a,"Test"); // STR-ing C-o-PY. 

Dieses stammt aus der Standard-Bibliothek C. Wenn Sie C++ verwenden, sollten Sie std :: string verwenden, es sei denn, Sie möchten wirklich die gesamte mögliche Leistung von Ihrem Ziel-PC aussaugen.

0

Dies liegt daran, dass die Initialisierung keine Zuweisung ist. Das erste, was funktioniert, ist eine Initialisierung, und das zweite, was nicht wie erwartet funktioniert, ist die Zuweisung. Sie können einfach keine Werte zu Arrays zuweisen, die Sie wie zB strcpy oder memcpy verwenden sollten. oder Sie können alternativ verwenden std::copy von <algorithm>

-2

Es ist so einfach, (=) haben zwei verschiedene mittlere Zuordnung und Initialisierung. Sie können auch Ihren Code wie die

  #include <iostream> 

     using namespace std; 

      int main() 
     { 
      char message[3] = {'H', 'i', '\0'}; 

       cout << message<< endl; 

      return 0; 

      } 

in diesem Code schreiben, haben Sie keine Notwendigkeit haben einen schwierigen Code oder Funktion und auch keine Notwendigkeit, von string.h