2014-06-09 2 views
1

더 안전하게 을 사용하여 strcpy으로 전화를 업데이트하려고합니다. 이전의 함수 호출은 다음과 같습니다 :보안 strcpy_s 함수는 어떻게 사용할 수 있습니까?

char buf[6]; 
strcpy(buf+1, "%#c"); 

위의 코드를보다 안전한 버전으로 바꾸려면 size 매개 변수에 무엇을 넣을까요?

char buf[6]; 
strcpy_s(buf+1, /*SIZE GOES HERE*/, "%#c"); 

가 나는 코드의 buf+1 부분과 혼동 얻고 가정합니다. 그것은 본질적으로 포인터가 buf에서 하나 이상의 블록을 가리키는 포인터입니까? 그렇다면 SIZE 매개 변수 strcpy_s에 대해 무엇을 입력해야합니까? 나는 시도했다 : 작동하는 것 같다,하지만 그것을 할 수있는 더 좋은 방법이 있는지 궁금

strcpy_s(buf+1, sizeof(buf+1), "%#c"); 

.

+0

등록기를 가리킬 수 없습니다. –

답변

5

당신이buf시작으로 복사 된 경우에, 당신은 말할 것 :

strcpy_s(buf, sizeof(buf), "%#c"); 

첫 번째 문자를 건너 뛰는하고 있기 때문에, 당신은 그래서 작업 할 일 개 적은 문자를 가지고 :

strcpy_s(buf + 1, sizeof(buf) - 1, "%#c"); 
0

buf+1은 시작 주소가 buf 인 메모리 위치를 가리키므로 효과적으로 해당 위치에서 복사가 시작됩니다. 그러나 size 매개 변수는 의 대상 크기를 지정합니다 (). 해당 매개 변수에 sizeof(buf+1)을 사용하는 것은 의미가 없습니다. 대상의 사용 가능한 공간 (은 < = (전체 크기 - 시작 오프셋)이어야 함)을 전달해야합니다.

귀하의 경우에는

,이 크기는 5 (첫 번째 인덱스를 건너 뛰려면 가정을)해야한다

strcpy_s(buf+1, sizeof(buf)/sizeof(*buf) - 1, "%#c"); 

look here for details

+0

'strcpy_s()'는 복사 할 요소의 수가 아닌 대상의 크기를 원합니다. 아주 다른 두 가지. –

+0

@PaulRoub, correct. 감사. – Rakib

1

해야한다. 적절한 계산 방법은 다음과 같습니다.

int offset = 1; // not necessary, but shows the connection between the size and offset 
strcpy_s(buf+offset, (sizeof(buf)-offset)/sizeof(buf[0]), "%#c"); 

char 크기에 의한 나누기는 중복되지만 와이드 문자를 사용하는 경우에 필요하므로 기억하는 것이 좋습니다.

+0

+1 : 대신 객체 자체를 사용해야합니다 : '... sizeof buf/sizeof * buf ...' – pmg

+0

@pmg, 좋은 지적, 편집 됨. – user2079303

+1

-1'sizeof (buf [0]) '문자를'buf' (sizeof (char)가 1이라는 것을 기억하십시오.)에서'offset'을 빼기 위해서 -1. 그것은 단지 이상합니다. – unwind

관련 문제