전처리 토큰을 문자열로 변환하십시오
-
04-07-2019 - |
문제
전처리 토크를 문자열로 변환하는 방법을 찾고 있습니다.
구체적으로, 나는 어딘가에 :
#define MAX_LEN 16
그리고 버퍼 오버런을 방지하는 데 사용하고 싶습니다.
char val[MAX_LEN+1]; // room for \0
sscanf(buf, "%"MAX_LEN"s", val);
나는 같은 일을 성취 할 수있는 다른 방법으로 개방적이지만 표준 라이브러리 만 가능합니다.
해결책
보다 http://www.decompile.com/cpp/faq/file_and_line_error_string.htm구체적으로:
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
따라서 문제를 해결함으로써 문제를 해결할 수 있습니다sscanf(buf, "%" TOSTRING(MAX_LEN) "s", val);
다른 팁
온라인으로 답변을 찾았습니다.
#define VERSION_MAJOR 4 #define VERSION_MINOR 47 #define VERSION_STRING "v" #VERSION_MAJOR "." #VERSION_MINOR
위의 내용은 작동하지 않지만 내가하고 싶은 일을 희망적으로 설명합니다. 즉, version_string은 "v4.47"으로 끝납니다.
적절한 숫자 형태를 생성하려면 같은 것을 사용하십시오
#define VERSION_MAJOR 4 #define VERSION_MINOR 47 #define STRINGIZE2(s) #s #define STRINGIZE(s) STRINGIZE2(s) #define VERSION_STRING "v" STRINGIZE(VERSION_MAJOR) \ "." STRINGIZE(VERSION_MINOR) #include <stdio.h> int main() { printf ("%s\n", VERSION_STRING); return 0; }
오랜 시간이 지났지 만 이것은 작동해야합니다.
sscanf(buf, "%" #MAX_LEN "s", val);
그렇지 않은 경우 "이중 확장"트릭이 필요합니다.
#define STR1(x) #x
#define STR(x) STR1(x)
sscanf(buf, "%" STR(MAX_LEN) "s", val);
Double-Polpansion Stringification 매크로 트릭을 사용해야합니다. 아니면 그냥 가지고 있습니다
#define MAX_LEN 16
#define MAX_LEN_S "16"
char val[MAX_LEN+1];
sscanf(buf, "%"MAX_LEN_S"s", val);
그리고 동기화하십시오. (약간 귀찮은 일이지만 정의가 서로 바로 옆에있는 한 아마도 기억할 것입니다.)
실제로이 특별한 경우에는 그렇지 않습니다 strncpy
충분하다?
strncpy(val, buf, MAX_LEN);
val[MAX_LEN] = '\0';
만약 그렇다면 printf
, 그러나 이것은 더 쉬울 것입니다.
sprintf(buf, "%.*s", MAX_LEN, val);
위의 "작업"중 일부는 개인적으로 LiBC에 나오는 Leck 대신 간단한 문자열 API를 사용하는 것이 좋습니다. 휴대용 API가 많이 있으며 일부는 프로젝트에 쉽게 포함 할 수 있도록 최적화되어 있습니다. USTR 작은 공간 오버 헤드와 스택 변수를 지원합니다.