2014-07-12 1 views
0

문자열을 문자 배열로 복사하는 데 strcpy()을 사용해야하는 이유는 무엇입니까?왜 char array는 charArray = "some string"처럼 복사 할 수 없습니다;

나는 this.It에서 내 2 시간을 낭비했다. 나는 어떤 오류도 보이지 않았지만 예상대로 출력이 아니었고 나는 오류를 발견하기 위해 2 시간 동안 고생했다.

그냥 가비지 문자를 표시했습니다.

strcpy()을 사용하면 문제가 없습니다.

+10

'std :: string'을 사용하지 말고 걱정거리를 남겨 두지 마십시오. –

+0

예 : std :: string을 사용했지만 프로젝트에 기존 C 코드가 있고 다시이 문자열을 char로 변환해야합니다. – Ali786

+3

"C-string"이 필요합니까? 그게'std :: string :: c_str()'의 목적입니다. – nmaier

답변

0

짧은 답변 :
이것은 배열에 메모리가 정적으로 할당되고 다시 초기화 할 수 없기 때문입니다.
배열 크기가 고정되어 있습니다.
대신 std::string을 사용할 수 있습니다.

그래도 char* 포인터를 사용할 수 있습니다.

1

긴 대답 :

당신이 그 배열의 이름의 사용은 본질적으로 배열의 첫 번째 요소에 대한 포인터를 사용하는 것과 같습니다 인 int, char or MyClass 배열인지, C++의 모든 배열을 선언하면

. 이것은 배열이 동적으로 할당되자 마자 명백히 드러나지 만, 정적으로 할당 된 배열의 경우에도 마찬가지입니다.

char arr[] = "Lorum ipsum"; 

수단 : 다음 코드 것을 의미

는 스택에 12 자에 대한 충분한 공간을 할당하고, 편곡 첫 번째 문자에 대한 포인터처럼 행동하자,이 포인터는 const를하다 (포인트 변경할 수 없습니다하는 것입니다 즉.) 따라서

당신이 작성하려고하는 경우 :

const char * arr2 = "hello"; 
arr = arr2; // Error 

정말로 묻고있는 것 : 변경 불가능한 포인터처럼 동작하는 arr을 변경하면이 상수 문자열의 첫 번째 문자를 가리킬 수 있습니다. 허용되지 않습니다.

const char * cstr1 = "Hello"; 
const char * cstr2 = "Bye"; 
cstr1 = cstr2;   // All is good, you are only changing which 
         // c-string in the global data you are pointing to. 
0

짧은 대답 : 효율성을 위해
대신 상수 문자열에 대한 포인터를 사용하는 경우

말했다되는 것을, 당신은 설명 된 구문을 사용할 수 있습니다. 배열을 복사하지 않으려는 사람들을위한 것입니다.

원시 포인터를 사용할 때는 자신의 성능 요구 사항을 충족시키기 위해 기념 관리, 복사 동작 등과 같은 모든 세부 사항을 고려해야합니다. 다른 대부분의 경우를 만족하도록 설계된 std::string을 사용할 수 있습니다.

2

답변의 또 다른 해석은 char 배열이 operator =이 대체되는 클래스가 아닌 기본 유형이라는 것입니다.

@ StianV.Svendenborg에 의해 언급 된 것처럼 char 배열을 다른 배열에 할당하는 것은 그 주소를 다른 char 포인터 변수에 할당하는 것을 의미합니다.

문자 배열 등의 할당;

char test[4]={1,2,3,4}; 

4 바이트 (a CHAR 값 각)의 할당을 초래한다. 이러한 test 결과 것이다 산술 같은 표현식에서

번째 요소의 어드레스를 가리키고 pointer.For 예 test+1처럼 행동하고 *(test+1) == 2 사실 일 것이다 print("%p",test)는 어레이의 첫 번째 요소의 주소를 출력 할 것이다.

클래스 std::stringoperator=을 사용하는 경우 기능이 할당 된 모든 필드를 통과하여 고려하지 않고 복사합니다.

+0

배열이 포인터가 아닙니다. –

+0

나는 그 행동을 설명하려고 노력했다. – ifyalciner

+0

행동을 설명하기 위해 사실인지 아닌지를 진술 할 필요는 없습니다. –

0

소위 C-문자열은 문자열 처리를위한 높은 수준의 언어 기능이없는 C 언어에서 유래. 당신이 이해할 필요가 여기에 두 개의 서로 다른 개념이 있습니다

  • 문자열 리터럴을 "abc", ""처럼 "my string literal"
  • 문자열 변수

첫 번째 사람은이 nonmodifable (를 UB있다 modyfing n 실제 문자 수를 더한 널 문자'\0'이다 유형 char[n]의) 배열하는 repesent 문자열의 끝과 항상 존재해야합니다. 배열 구독 연산자를 사용하여 개별 요소에 직접 액세스 할 수 있습니다. "abc"[1] 결과는 'b' 자입니다.

두 번째 사람은 C - 문자열을 저장할 수있는 프로그래머가 선언 된 배열이다. 예를 들어 :

#define STR_LEN 60 

char str[STR_LEN+1] = "abc"; 

리터럴 "abc" 문자열 배열 이니셜 라이저를 혼동하지 마십시오, 동일하지 같은 일이 이다. char 배열이 선언

char *p_str = "abc" /* "abc" is string literal */ 

후에는 할당 할 수 없습니다 : 당신은하지 char 배열 char 포인터를 필요

char str[STR_LEN+1] = {'a', 'b', 'c', '\0'}; 

처리하기 위해 문자열 리터럴 : 사실 (이 배열의 크기) 등 initiliazer는 동일합니다 문자열 리터럴을 직접 입력하십시오. 예 :

str = "def"; /* wrong, str is array, not pointer (not l-value) */ 

새 문자열을 배열 (string var iable) 요소, 예컨대 : 대신 개별 문자를 할당

str[0] = 'd'; 
str[1] = 'e'; 
str[2] = 'f'; 
str[3] = '\0'; /* very important */ 

을 수정, 당신은 당신을 위해 그것을 할 수있는 기능, 예를 쓸 수 있습니다:

char *my_strcpy(char dst[], const char *src) 
{ 
    while ((*dst++ = *src++)) /* copying idiom */ 
     ; 
    return dst; 
} 

예 호출

my_strcpy(str, "def"); 
my_strcpy(str, p_str); 

대신 당신에게 자신의 함수를 작성 당신은 당신을 위해 그것을 할 strcpy (또는 작은 안전 strncpy)를 사용할 수 있습니다. 이야기의 끝.

관련 문제