문제

전처리 토크를 문자열로 변환하는 방법을 찾고 있습니다.

구체적으로, 나는 어딘가에 :

#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 작은 공간 오버 헤드와 스택 변수를 지원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top