sprintf
은 int sprintf (char * str, const char 형식, ...)로 선언됩니다. char* str
은 출력을 기록 할 버퍼이지만 악의적 인 사용자는 해당 버퍼의 크기보다 많은 버퍼를 넣을 수 있으므로 snprintf
에는 출력 버퍼의 크기를 포함하는 매개 변수가 포함되어 있기 때문에 bufferoverflow가 발생하지 않습니다. 주의해야 할 점은 쓰여진 바이트 수를 반환하므로, 문자 또는 char []에 할당 할 수 없습니다.
const char* foo = "foo";
static char end[BUFSIZE];
snprintf(end, BUFSIZE, ""%s_bar", foo);
나는이 쉽게 보안 오류 인 버퍼 오버 플로우가 발생하지 않습니다에 대한 snprintf
를 사용하는 것을 선호합니다. 이제 BUFSIZ
문자를 end
에 인쇄 할 수 있습니다. snprintf가 strlen ("s_bar") + strlen ("foo")를 반환하면 연결이 성공했는지 확인할 수 있습니다.
당신도 할 수있는 것은 :
아마도 더 당신이 좋아하는 무엇
char end[BUFSIZE] = "foo_";
strncat(end, "_bar", BUFSIZ);
.
#define FOO_INITIALIZER "foo"
const char *foo = FOO_INITIALIZER;
static char *end = FOO_INITIALIZER "_bar";
내가 당신을 구입 얼마나 많은 모르겠어요,하지만 컴파일하고 문자열의 반복을 방지해야합니다
매크로에 '##'연산자를 사용할 수 있습니다. –
@alk - 변수가 있으면 어떨까요? 그래서 "_bar"는 실제로 변수 바입니다 ... – user983223
64 비트 기계에서 포인터를위한 8 바이트와 문자열을위한 4 바이트를'foo'를 지원하기 위해 12 바이트 할당했습니다. 무언가를 얻으려면'end'에 16 바이트가 할당됩니다 : 포인터는 8 바이트, 문자열은 8 바이트입니다. 어떻게 든 문자열의 8 바이트를 지정해야합니다. 'const char foo [] = "foo";를 사용하면 문자열에 4 바이트 만 할당하고'const char end [] = "foo_bar";는 문자열에 8 바이트 만 할당합니다. –