2012-01-18 2 views
8

나는 현재의 디렉토리 경로에 \의 init.scm을 추가 sprintf(newpath, "%s%s", cCurrentPath, "\\init.scm");를 사용하고 있지만, 일반적인 경고가 : sprintf의 sprintf_s 아날로그 란 무엇입니까 (newpath, "% s % s", ...)?

Sprintf_s

warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

는 "%의 %의"문자열을 지원하지 않습니다는 합집합. sprintf_s을 사용하여 어떻게 할 수 있습니까?

+0

"Sprintf_s는"% s % s "문자열 합계를 지원하지 않습니다? 확실합니까? (보통은 문자열이 아니라 합계가 아닌 문자열에 대해 이야기 할 때 보통 연결이라고합니다.) – Mat

+0

예 C4024 경고 : 'sprintf_s': 형식 및 실제 매개 변수 2에 대한 유형이 다릅니다 \t 및 실행시 오류 발생 – Cynede

+0

코드에 버그가 있습니다. . – Mat

답변

14

sprintf_s는 기본적으로 sprintf과 동일하지만, 다른 매개 변수를 가져옵니다

sprintf_s(newpath, sizeof(newpath), "%s%s", cCurrentPath, "\\init.scm"); 

주 - newpath는 일반 문자 배열, sizeof(newpath) 작품 인 경우. 포인터 또는 인수가 인수로 전달 된 배열 인 경우 크기를 가져 오는 다른 방법이 필요할 수 있습니다.
비 MS 환경에서도 동일한 목적으로 snprintf을 사용할 수 있습니다 (다르게 작동 함에도 불구하고).

+0

% s % s은 (는) newpath로 연결될 2 개의 문자열의 합입니다. 그것을 만드는 방법? – Cynede

+0

_s 함수는 안전을 위해 작성되었으므로 할당되지 않은 메모리를 덮어 쓰지 마십시오. 이러한 이유 때문에 두 번째 매개 변수는 첫 번째 매개 변수에 할당 된 메모리의 크기 여야합니다.) 다음 매개 변수가 없으므로 실제 텍스트가 예상보다 길면 메모리 액세스 위반이 발생하지 않습니다. –

+0

죄송합니다. 형식 문자열을 생략했습니다. 지금 고쳐서, 내가 쓰는 것처럼 그것을 사용합니다. – ugoren

관련 문제