2012-10-02 2 views
-2

그래서 기본적으로 strcpy는 첫 번째 인수에 두 번째 인수의 주소를 할당하지만 첫 번째 인수로 배열에 대해 어떻게 처리합니까? 내 프로그램 에서처럼, 나는 배열의 주소를 변경하려고했지만 불행히도 그것은 컴파일되지 않을 것이다. 그래서 나는 capitalize의 반환 값을 할당하기 위해 문자 포인터 변수를 만들어야 만했다. 내가 오해하고 있는게 있니?배열의 주소를 변경할 수 없을 때 strcpy()가 문자열을 배열에 복사하는 방법은 무엇입니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef char string[20]; 
char *Capitalize(char *str) 
{ 
    int i; 
    char *temp; 
    temp = malloc(sizeof(char)*(int)(strlen(str)+1)); 
    for(i = 0;i < strlen(str);i++) 
    { 
     if(*(str+i) >= 'a' && *(str+i)<= 'z') 
      *(temp+i) = *(str+i) - 32; 
     else 
      *(temp+i) = *(str+i); 
    } 
    *(temp+i) = '\0'; 
    return temp; 
} 
int main(void) 
{ 
    string word; 
    printf("Enter word to capitalize: "); 
    scanf("%19s",word); 
    word = Capitalize(word); 
    printf("%s",word); 
    return 0; 
} 
+4

없이 그것을하지 않습니다, 그것은 내용을 복사 "의 strcpy는 1 일에 제 2 인수의 주소를 할당");

희망 나는 명확 내 설명과 함께 더 혼란하지 않았습니다. – Mat

+1

strcpy()에 대한 예제 코드가 없는데 왜 그것을 묻는거야? – Glenn

+0

@Glenn word = Capitalize (word) 이것은 에러를 발생시키기 때문에 strcpy()가 배열에 두 번째 인수의 주소를 할당하는 방법을 궁금해했습니다. 나는 현을 연습하고있어서 갑자기 그 생각을 숙고했다. – latenightcode

답변

1

strcpy()은 이름에서와 같이 복사본을 만듭니다. 문자열을 배열에 복사하는 것은 매우 합법적입니다.

당신은 같은 배열의 초기화를 할 때 :

char myarr[] = "hello"; 

당신은 실제로 배열로 문자를 복사하고 있습니다.

당신은 포인터 (see here for some reason you can't treat them the same)

0

당신이 누락 된 것으로 보인다 건과 혼란 배열이 될 것입니다 C에서/C++ 문자열은

char c[] = "hello"; 

을 선언하는 가장 실용적인 측면에서 배열이다
char* c = "hello"; 

은 모두 똑같습니다. 모든 strcpy는 해당 메모리가 배열로 할당되는지 여부에 상관없이 대상 메모리에 문자를 복사합니다 (아마도 o n 스택) 또는 포인터 (아마도 힙)에 영향을 미치지 않습니다.

+1

아니요, 두 선언은 매우 다릅니다. 첫번째는'char [6]'을 선언하고'c'는 수정할 수 있지만,'c = whatever; '는 할당 할 수 없습니다. 컴파일 할 수 없습니다. 두 번째는 포인터를 선언하고 _unmodifiable_을 가리 키도록 초기화합니다 (수정 가능하지만 그렇게하려고하면 정의되지 않은 동작이 발생합니다). char [6]', 그러면 포인터에 다른 주소를 할당 할 수 있습니다. 염원. –

+0

그들은 동일하지 않습니다. 첫 번째로,'c'는 배열이고, 두번째'c'는 읽기 전용 메모리에 대한 포인터입니다. 또한 C++에서 문자열은 배열이 아닙니다 (또는 적어도 그렇게해서는 안됩니다). – netcoder

+0

"가장 실용적인 측면에서"또한 나는 그것이 정의 된 임 플리 멘 테이션 인 메모리 만 읽기위한 포인터라는 생각을 어디서 얻었는지 잘 모르겠습니다. – tletnes

0

C에서 인덱서없이 이름으로 배열을 한정하는 것은 배열의 첫 번째 요소의 메모리 주소에 대한 포인터를 지정하는 것과 같습니다. 따라서 strcpy과 같은 함수에 배열 매개 변수로 전달할 수 있습니다.

char * strcpy (char * destination, const char * source); 

strcpy가 널 문자까지 destination에 의해 지정된 메모리 주소로 source에 의해 지정된 메모리 주소에서 시작, 발견되는 어떤 일련의 문자 복사합니다 (0) 발견된다 (이 널 문자는 복사됩니다 목적지 버퍼).

매개 변수에 지정된 주소 값은 수정되지 않으며, 메모리에서 복사 할 위치와 위치를 지정합니다. destination이 복사 된 문자열을 수용 할 수있을만큼 충분한 용량을 가진 메모리 버퍼 (char 배열 또는 malloc을 통해 요청 된 메모리 블록 일 수 있음)를 가리키는 것이 중요합니다. 그렇지 않으면 버퍼 언더런이 발생합니다 (끝에 문자를 쓰게됩니다. 여러분의 프로그램이 충돌하거나 이상한 방식으로 행동 할 수도 있습니다.

관련 문제