2013-02-16 2 views
11

를 숯불하기 : Array type char is not assignable.할당 값은 내가</p> <pre><code>char a[10] = "Hi"; </code></pre> <p>를 입력 할 때 나는 오류를 얻을하지만 다음에 변경할 때, 나는 오류가 발생하는 배열

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

왜 배열 char 형하지 할당 할 수 있습니까? 언어가 의도적으로 쓰여졌거나 요점을 놓치기 때문입니까?

+0

조차 필요 없음을 쓸 필요가없는이 코드에 그

 #include <iostream> using namespace std; int main() { char message[3] = {'H', 'i', '\0'}; cout << message<< endl; return 0; } 

같은 코드를 작성할 수 있습니다 : 이것은 ++ C 태그되어 있기 때문에,이다 a * non * -strcpy "char []"를 다루는 동안 이것을하는 더 많은 C++ 방법? –

+0

"more C++ way"는 char [] 대신에 문자열이나 벡터 을 사용하는 것입니다. char []를 사용하면 기본적으로 모든 C 언어를 사용할 수 있습니다. – Cogwheel

+0

ur 응답 녀석을위한 감사합니다. –

답변

12

에서 내가 위에서 주석으로,이 일의 C++ 방법을 std::copy를 사용할 수 있습니다. 그것은 당신에게 당신이 기대하는 과제 행동을 줄 것입니다.

당신은 두 번째 경우에 대한 오류를 얻고있는 이유는이 두 줄의 =가 다른 것을 의미하는 것입니다, 말했다 :

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

첫 번째는 초기화입니다, 두 번째 과제는 .

첫 줄은 스택에 10 개의 문자를 저장할 충분한 공간을 할당하고 처음 세 개의 문자를 'H', 'i'및 '\ 0'으로 초기화합니다. 이 시점부터 모든 a은 스택에있는 배열의 위치를 ​​나타냅니다. 배열은 스택의 한 장소 일 뿐이므로 a은 절대 변경 될 수 없습니다. 스택의 다른 위치에 다른 값을 저장하려면 다른 변수가 필요합니다.

두 번째 줄 (잘못된)은 a을 (기술적으로 다른) 주문을 "Hi"으로 변경하려고 시도합니다. 위에서 언급 한 이유 때문에 허용되지 않습니다. 초기화 된 배열을 얻은 후에는 배열에서 값을 읽고 값을 쓸 수 있습니다. 위치 나 크기를 변경할 수 없습니다. 이것은 과제가이 경우에하려고 시도 할 것입니다.

+1

당신은 ' std :: string' 그리고 OP가 원하는 행동을 얻으시겠습니까? 나는 그것이 좋은 대답에 좋은 추가라고 생각합니다. – NathanOliver

+1

예, 저는 보통이 질문에 두 가지 계층 응답을 제공하려고합니다 (하나는 직접, 다른 하나는 의도를 추측). 묻는 사람이 내 의견을 보았고이 스레드가 속도록 닫 혔기 때문에 걱정하지 않았습니다. – Cogwheel

2

a는 배열 자체가 아니라 배열에 대한 포인터입니다. 재 할당 할 수 없습니다.

C++ BTW 태그가 지정되었습니다. 이 경우에 std :: string을 더 잘 사용하십시오. 아마 당신이 기대하는 것 이상입니다.

+1

'a'는 배열 자체가 아니라 배열을 가리키는 포인터입니다. * 암시 적으로 첫 번째 요소에 대한 포인터로 변환 될 수 있습니다. –

8

언어에서는 문자열 리터럴을 문자 배열에 할당 할 수 없습니다. 대신 strcpy()를 사용해야합니다

strcpy(a, "Hi"); 
+1

맞음 - 이런 상황에서'strcpy'를 사용해야합니다. 당신이 'strncpy'에 대해 들어 본 적이 없다면 아마 전혀 손실이 없을 것입니다. 거의 'gets'만큼 쓸모가 없습니다. –

+0

관련 [차이점 'strcpy'와 'strcpy_s'?] (http://stackoverflow.com/questions/32136185/difference-between-strcpy-and-strcpy-s) –

16

배열은 수정 좌변

사용 간단한

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

되지는

char a[10] = "Hi"; 

조금 "추가 기능"입니다, 그것은 실행 시간에 그렇게 할 수 없기 때문입니다.

하지만 이것이 C/C++ 표준 라이브러리의 이유입니다.

#include <string.h> 

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

이것은 C의 표준 라이브러리에서 가져온 것입니다. C++을 사용하는 경우 대상 PC에서 가능한 모든 성능을 완전히 빨지기를 원하지 않는 한 std :: string을 사용해야합니다.

0

초기화가 할당이 아니기 때문입니다. 작동하는 첫 번째 작업은 초기화 작업이며 예상대로 작동하지 않는 두 번째 작업은 할당 작업입니다. strcpy 또는 memcpy과 같이 sth를 사용해야하는 배열에는 값을 할당 할 수 없습니다. 또는 당신은 다른 방법 std::string 대신 char[]를 사용하는 것, <algorithm>

-2

너무 간단하고 (=) 두 가지 다른 평균 지정 및 초기화가 있습니다. 당신은 또한 당신이 어려운 코드 또는 기능과 string.h 응답에 대한

관련 문제