2011-08-21 3 views
1

나는 unsigned char 인 두 개의 버퍼를 사용하고 있고 strcpy 함수를 사용할 때 "unsigned char *를 char *로 변환 할 수 없다"라는 컴파일 오류가 있습니다. 아무도 서명 버퍼와 서명 된 버퍼가 어떤 차이를 만들어 내는지 알려주시겠습니까? 이것은 내가 시도한 프로그램이다. 타입 캐스팅은 문자열 함수에서 *는 char 않는 것은 만드는 모든 : 내가 (의 char *)에 strcpy를 전달 된 parametrs을 캐스트 할 때strcpy 함수에 의문의 여지가있다

 main() 
     { 
       unsigned char buff[20] = "Michael"; 
       unsigned char dst[20] = "Jackson"; 
       strcpy((char *)buff,(char *)dst); 
       printf("The string is %s\n",buff); 

     } 

두번째 질문 아래와 같이

 main() 
     { 
       unsigned char buff[20] = "Michael"; 
       unsigned char dst[20] = "Jackson"; 
       strcpy(buff,dst); 
       printf("The string is %s\n",buff); 

     } 

지금,이 프로그램 자체는 잘 작동 문제?

입력이 더 필요하면 알려주십시오.

+3

@Yahia가 동의했습니다 : Maddy, 답변을받을 수없는 몇 가지 뛰어난 질문이 있습니다. 그들은 정말로 당신의 질문에 대답을하지 않았거나 그것이 어떻게 작동하는지에 익숙하지 않은가요? – shelleybutterfly

답변

6

그냥 변경할 수 있습니다

unsigned char buff[20] = "Michael"; 
unsigned char dst[20] = "Jackson"; 

char buff[20] = "Michael"; 
char dst[20] = "Jackson"; 

에 논리적으로 생각하고, 문자열이이 숫자 값을하지 않습니다 서명 또는 서명 할 수 없다는 그런 식으로 처리 할 그것은 단지 char 배열이며 선언하고 사용해야한다.

왜 오류가 발생합니까?
strcpy
프로토 타입이 있습니다

가 그리고 당신이 그것을 전달하는 것은 함수 매개 변수 유형 검사가 발생 호출 될 때, unsigned char*입니다
char *strcpy(char *restrict s1, const char *restrict s2); 

을 컴파일러는 적절한와 함수를 호출하지 않는 것을 발견 타입 매개 변수와 그것에 따라서 그것에 대해 불평 캐스트를 적용하면 함수 인수가 일치하므로 컴파일을 통과합니다.

는 문제를 만들 문자열 함수에를 숯불하는 타입 캐스팅을합니까? *
아니,이 경우에는 그렇지 않습니다.
대답에서 위에 언급 된 이유 때문에 unsigned char의 사용을 변경하는 것이 더 합리적입니다.

제안 : 당신이 strncpy을 개시 훨씬 더 그래서, 당신이 명시 적으로 복사보다는 소스 문자열의 널 (NULL) 종료에 의존 얼마나 많은 문자를 지정할 수 있습니다
Strcpy는 안전하지 않습니다는 또한이 도움이 명시 적으로 길이를 지정하므로 버퍼 오버 플로우가 발생하지 않습니다.

+0

@ Als .. 예, 나는 그것을 바꿨고 괜찮 았어.하지만 서명되지 않은 char 배열을 사용할 수없는 이유를 알고 싶습니다. – Maddy

+0

글쎄, 그것이 그것이 정의 된 방식이라고 생각하기 때문이다. unsigned char 및 char은 두 가지 유형이며 "Hello World"와 같은 문자열 리터럴은 부호없는 char이 아닌 char의 배열입니다. strcpy 함수 (와 strlen, strncpy 등)는 unsigned *가 아닌 char *를 기대합니다. – shelleybutterfly

+0

@Maddy : 업데이트 된 답변을 확인하십시오. –

5

사용하는 방식이 좋을 것입니다.

그러나 문자열 처리 기능이있는 배열 unsigned char을 사용하면 안됩니다. C 문자열에는 부호없는 char 배열이 아닌 char 배열이 있습니다. strcpy으로 전달하면 unsigned 한정자가 삭제되므로 컴파일러에서 경고합니다.

일반적으로 할 필요가없는 경우 서명하지 않도록 설정하십시오.

+0

@cnicutar ... 컴파일러에서 경고 대신 오류가 발생합니다. "unsigned cchar *을 signed char * .So로 잘못 변환했습니다. 부호가없는 char 배열 대신 항상 signed char 배열을 사용하는 것이 더 좋지 않습니까? – Maddy

+0

@Maddy What 컴파일러입니다 .AC 컴파일러 ** 그것을하지 말아야합니다. **. – cnicutar

+0

@Maddy "부호없는"을 생략하는 것은 "서명 된"을 의미하지는 않습니다;) – cnicutar

0

strcpy은 평이하고 단순한 char *을 원합니다. char * 님의 버퍼를 전송하면 문제가 없습니다. 그렇다면 처음에는 strcpy을 사용하는 데있어 전체 안전 문제가 있습니다 ...

관련 문제