2013-08-01 2 views
0

다음은 작동하지 않지만 동일한 기능을 제공한다는 것을 알고 있습니까?연결이있는 메인의 전역 변수?

const char *foo = "foo"; 
static char *end = sprintf ("%s_bar", foo); 

내가 원하는 것은 문자열을 연결 한 다음 그 연결된 문자열을 정적 변수로 만들어 전역 변수가되게하는 것입니다. 또한 나는 char에 메모리를 할당 할 필요가 없다. main()에 들어가려면이 함수가 필요합니다. 두 개의 문자열을 병합하는 함수 (sprintf)를 사용해야하기 때문입니다.

+2

매크로에 '##'연산자를 사용할 수 있습니다. –

+0

@alk - 변수가 있으면 어떨까요? 그래서 "_bar"는 실제로 변수 바입니다 ... – user983223

+1

64 비트 기계에서 포인터를위한 8 바이트와 문자열을위한 4 바이트를'foo'를 지원하기 위해 12 바이트 할당했습니다. 무언가를 얻으려면'end'에 16 바이트가 할당됩니다 : 포인터는 8 바이트, 문자열은 8 바이트입니다. 어떻게 든 문자열의 8 바이트를 지정해야합니다. 'const char foo [] = "foo";를 사용하면 문자열에 4 바이트 만 할당하고'const char end [] = "foo_bar";는 문자열에 8 바이트 만 할당합니다. –

답변

1

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"; 

내가 당신을 구입 얼마나 많은 모르겠어요,하지만 컴파일하고 문자열의 반복을 방지해야합니다

+1

'char end [BUFSIZE] ...'라고 쓰고 싶습니까? – alk

+0

@ ok oops 잘 편집 됨 ;-) – hetepeperfan

1

표면적으로, 다음과 같이 코드를 수정할 수 있습니다. 인접한 문자열 리터럴 연결을 사용합니다.이 연결은 C89 이상에서 표준이지만 (사전 표준 컴파일러에는 포함되지 않습니다).

1

나는 stringizing 연산자로 할 수 있다고 생각합니다.

#define STR_CONCAT(x, y)  #x#y 

static char *end = STR_CONCAT(foo, _bar); 

int main(void) 
{ 
    printf("%s", end); // prints out "foo_bar" 
    getchar(); 
    return 0; 
} 
+2

문자열을 연결하는 데'##'을 사용할 수 없습니다. (또는 최소한 컴파일러는 그렇게하지 않아야합니다.) 그렇게하지 않아도됩니다. 문자열 연결이 자동으로 이루어지기 때문입니다. –

+0

@JonathanLeffler : 이것은 실제로 테스트되었습니다 (MS VS2010). 그래서 나는 그것을 할 수있다. :) – abelenky

+2

표준 호환 컴파일러가 필요합니다! GCC는'cat.c : 3 : 1 : error : pasting ""foo "와" "_bar"는 "유효한 전처리 토큰을주지 못합니다."라고 말합니다. –