2013-02-16 20 views
11

dostaję żadnego błędu, gdy wpisujęwartość Przypisanie do tablicy char

char a[10] = "Hi"; 

Ale kiedy go zmienić na następujących, otrzymuję komunikat o błędzie: Array type char is not assignable.

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

Dlaczego typ tablicy char nie jest możliwe do przypisania? Czy to dlatego, że język jest napisany w ten sposób celowo, czy też brakuje mi jakiegoś punktu?

+0

Dla odpowiedzi: Ponieważ jest to oznaczone C++, jest tam * nie * -strcpy "więcej C++" sposób to zrobić mając do czynienia z 'char []'? –

+0

"Bardziej w stylu C++" byłoby użycie ciągu lub wektora zamiast char []. Używając char [], zasadniczo akceptujesz wszystkie C-ności, które się z tym wiążą. – Cogwheel

+0

dzięki za kolesie. –

Odpowiedz

12

C++ sposób to zrobić, jak już zauważył powyżej, byłoby wykorzystanie std::string zamiast char[]. To da ci oczekiwane zachowanie przydziału.

Powiedział, że powodem dostajesz tylko błąd za drugim przypadku jest to, że = w tych dwóch liniach oznaczać różne rzeczy:

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

Pierwszy to inicjalizacja, drugi jest przypisanie .

Pierwsza linia przydziela wystarczającą ilość miejsca na stosie, aby pomieścić 10 znaków, i inicjalizuje pierwsze trzy z tych znaków, aby były "H", "i" i "\ 0". Od tego momentu wszystkie wartości a odnoszą się do położenia macierzy na stosie. Ponieważ tablica jest tylko miejscem na stosie, a nigdy nie może się zmienić. Jeśli chcesz, aby inna lokalizacja na stosie zawierała inną wartość, potrzebujesz innej zmiennej.

Druga linia (nieważna) próbuje zmienić a, aby odnieść się do (odmiennej technicznie) inkantacji "Hi". To nie jest dozwolone z powodów wymienionych powyżej. Gdy masz już zainicjowaną tablicę, jedyną rzeczą, którą możesz z nią zrobić, jest odczytanie z niej wartości i zapisanie do niej wartości. Nie możesz zmienić jego lokalizacji ani rozmiaru. Właśnie to zadanie spróbuje wykonać w tym przypadku.

+1

Czy mógłbyś dodać, że możesz użyć '' std :: string' i uzyskać zachowanie, jakiego chce OP? Myślę, że byłby to dobry dodatek do dobrej odpowiedzi. – NathanOliver

+1

Tak, zazwyczaj staram się udzielać dwóch poziomów odpowiedzi na takie pytania (jeden bezpośredni, drugi drugi - odgadywanie intencji). Ponieważ pytający zobaczył mój komentarz i ten wątek został zamknięty jako dupe, chyba nie zawracałam sobie głowy. – Cogwheel

2

a jest wskaźnikiem do tablicy, a nie do samej tablicy. Nie można go ponownie przypisać.

Oznaczyłeś tag C++ BTW. W tym przypadku lepiej użyj std :: string. To prawdopodobnie więcej, niż się spodziewasz.

+1

'a' to sama tablica, a nie wskaźnik do tablicy. * * Może być niejawnie przekonwertowany na wskaźnik do pierwszego elementu. –

8

Język nie pozwala na przypisywanie literałów łańcuchowych do tablic znaków. Należy użyć strcpy() zamiast:

strcpy(a, "Hi"); 
+1

Prawidłowo - w takiej sytuacji należy użyć 'strcpy'. Zapominanie, że kiedykolwiek słyszałeś o "strncpy" prawdopodobnie nie byłaby żadną stratą - prawie tak samo bezużyteczne jak "dostaje". –

+0

Powiązane [Różnica między "strcpy" i "strcpy_s"?] (Http://stackoverflow.com/questions/32136185/difference-between-strcpy-and-strcpy-s) –

16

Tablica nie jest modyfikowalny lwartość

użycie

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

proste,

char a[10] = "Hi"; 

jest trochę "ekstra cecha" ponieważ nie można tego zrobić w czasie wykonywania.

Ale to jest powód standardowych bibliotek C/C++.

#include <string.h> 

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

Pochodzi ze standardowej biblioteki C. Jeśli używasz C++, powinieneś użyć std :: string, chyba że naprawdę chcesz wyssać całą możliwą wydajność z komputera docelowego.

0

dzieje się tak, ponieważ inicjalizacja nie jest zadaniem. pierwszą rzeczą, która działa, jest inicjalizacja, a druga, która nie działa zgodnie z oczekiwaniami, jest zadaniem. po prostu nie możesz przypisać wartości do tablic, powinieneś użyć czegoś takiego jak strcpy lub memcpy. lub alternatywnie można użyć std::copy z <algorithm>

-2

Jest to bardzo proste, (=) mają dwa różne przypisanie i inicjowanie. Można również napisać kod jak ten

  #include <iostream> 

     using namespace std; 

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

       cout << message<< endl; 

      return 0; 

      } 

w tym kodzie nie ma potrzeby, aby napisać kod lub trudną funkcję i nawet nie potrzebuje string.h