2010-04-29 4 views
2

C99에서 버퍼 오버런 방지에 도움이되는 sscanf 문자열 리터럴을 만들려고합니다. 내가 자동으로 (16)의 버퍼 크기 주어진 "% 15X"를 생성하는 것을 선호하는, 그러나C 전 처리기를 사용하여 scanf에 대한 문자열 리터럴을 구성 하시겠습니까?

#define MAX_ARG_LEN 16 
#define MAX_ARG_CHARS "15" 

char arg[MAX_ARG_LEN] = ""; 

if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0) 

:

#define MAX_ARG_LEN 16 

char arg[MAX_ARG_LEN] = ""; 

if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0) 

명백한 "수동"솔루션과 같이이다 : 목표는 같은입니다. 이 링크는 입니다.은 내 응용 프로그램에서 작동하지만 Convert a preprocessor token to a string은 -1을 처리하지 않습니다.

제안 사항?

답변

6

Kernighan과 Pike는 (우수) 서적 'The Practice of Programming'에서이 문제를 의논하고 을 사용하여 형식 문자열을 생성하는 것이 가장 안정적이며 이식 가능한 방법이라고 결론을 내 렸습니다.

#define STR_EVALUATE(x) #x 
#define STRINGIFY(x)  STR_EVALUATE(x) 
#define MAX_ARG_LEN 15 
char arg[MAX_ARG_LEN+1] = ""; 

if (sscanf(arg, "%" STRINGIFY(MAX_ARG_LEN) "X", &input) > 0) 
    ... 

을 아니면 15으로 MAX_ARG_STRLEN을 정의하고 MAX_ARG_LEN 및 MAX_ARG_STRLEN + 1로하면 그에 따라 일할 수 : 당신은 무엇을 할 수 있는지

는 길이를 제외한 터미널 널 (null)로 매크로를 정의하고이 같은 것을 사용합니다.

+0

누군가가 관심이있는 경우 조나단이 간접 접근법을 사용하여 수행 한 방식으로 왜 STRINGIFY()를 수행해야하는지에 대해 길게 설명합니다. http://stackoverflow.com/questions/798221/c- 매크로를 생성하는 문자열/798311 # 798311 –

+0

[SO 1489932] (http://stackoverflow.com/questions/1489932/c-preprocessor-and-)에서 토큰 붙여 넣기 ('##')에 대한 병렬 토론이 있습니다. 연쇄/). –

+0

위의 +1 구현은 완벽하게 좋은 해결책입니다 - 감사합니다! – Brett

관련 문제