snprintf 및 Visual Studio 2010
유감스럽게도 VS 2010을 프로젝트에 사용할 수 없게 되어 버렸습니다.또, 다음의 코드는, 비표준의 컴파일러를 사용해도 빌드 되지 않습니다.
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(C3861: 'snprintf': 식별자를 찾을 수 없음)
저는 이것이 VS 2005의 예전 사례로 기억하는데 아직도 고쳐지지 않은 것을 보고 놀랐습니다.
Microsoft가 2010년에 표준 C 라이브러리를 이행할 계획이 있는지 알고 있는 사람이 있습니까?
단편: Microsoft는 마침내 snprintf를 Visual Studio 2015에 구현했습니다.이전 버전에서는 다음과 같이 시뮬레이트할 수 있습니다.
롱 버전:
snprintf의 예상되는 동작을 다음에 나타냅니다.
int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );
최대 쓰기 수
buf_size - 1
문자를 버퍼로 변환합니다.다음 경우를 제외하고 결과 문자열은 null 문자로 끝납니다.buf_size
0 입니다.한다면buf_size
0, 아무것도 적혀 있지 않습니다.buffer
는 늘 포인터일 수 있습니다.return 값은 무제한이라고 가정한 문자 수입니다.buf_size
(종료하는 늘 문자는 카운트되지 않습니다.
Visual Studio 2015보다 이전 릴리스에는 적합한 구현이 없었습니다.대신 다음과 같은 비표준 확장 기능이 있습니다._snprintf()
(오버플로우에서는 null-terminator를 쓰지 않습니다) 및_snprintf_s()
(null-termination을 적용할 수 있지만 쓴 문자 수가 아닌 오버플로우 시 -1을 반환합니다).
VS 2005 이후 권장 폴백:
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf c99_snprintf
#define vsnprintf c99_vsnprintf
__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
{
int count = -1;
if (size != 0)
count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
if (count == -1)
count = _vscprintf(format, ap);
return count;
}
__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
{
int count;
va_list ap;
va_start(ap, format);
count = c99_vsnprintf(outBuf, size, format, ap);
va_end(ap);
return count;
}
#endif
snprintf
는 C89의 일부가 아닙니다.C99에서만 표준입니다.Microsoft는 C99를 지원할 계획이 없습니다.
(단, C++0x에서는 표준입니다)..!)
회피책에 대해서는, 다음의 다른 회답을 참조해 주세요.
반환값이 필요하지 않은 경우 snprintf를 _snprintf_s로 정의할 수도 있습니다.
#define snprintf(buf,len, format,...) _snprintf_s(buf, len,len, format, __VA_ARGS__)
@Valentin Milea의 코드를 시도했지만 액세스 위반 오류가 발생했습니다.유일하게 나에게 효과가 있었던 것은, 「Incanous Coding」의 실장입니다.http://asprintf.insanecoding.org/
구체적으로는 VC++2008 레거시 코드를 사용하고 있었습니다.Indian Coding의 구현(위 링크에서 다운로드 가능)에서 다음 3개의 파일을 사용했습니다.asprintf.c
,asprintf.h
그리고.vasprintf-msvc.c
기타 파일은 MSVC의 다른 버전용입니다.
【편집】완전성을 위해, 그 내용은 다음과 같습니다.
asprintf.h:
#ifndef INSANE_ASPRINTF_H
#define INSANE_ASPRINTF_H
#ifndef __cplusplus
#include <stdarg.h>
#else
#include <cstdarg>
extern "C"
{
#endif
#define insane_free(ptr) { free(ptr); ptr = 0; }
int vasprintf(char **strp, const char *fmt, va_list ap);
int asprintf(char **strp, const char *fmt, ...);
#ifdef __cplusplus
}
#endif
#endif
asprintf.c:
#include "asprintf.h"
int asprintf(char **strp, const char *fmt, ...)
{
int r;
va_list ap;
va_start(ap, fmt);
r = vasprintf(strp, fmt, ap);
va_end(ap);
return(r);
}
vasprintf-msvc.c:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "asprintf.h"
int vasprintf(char **strp, const char *fmt, va_list ap)
{
int r = -1, size = _vscprintf(fmt, ap);
if ((size >= 0) && (size < INT_MAX))
{
*strp = (char *)malloc(size+1); //+1 for null
if (*strp)
{
r = vsnprintf(*strp, size+1, fmt, ap); //+1 for null
if ((r < 0) || (r > size))
{
insane_free(*strp);
r = -1;
}
}
}
else { *strp = 0; }
return(r);
}
의 )test.c
Indian Coding indian indian indian :
#include <stdio.h>
#include <stdlib.h>
#include "asprintf.h"
int main()
{
char *s;
if (asprintf(&s, "Hello, %d in hex padded to 8 digits is: %08x\n", 15, 15) != -1)
{
puts(s);
insane_free(s);
}
}
「 」의 또 snprintf()
★★★★★★★★★★★★★★★★★」vsnprintf()
는 ffmpeg에 의해 제공됩니다.여기서 소스를 확인할 수 있습니다(권장).
에 상당하는 은 Windows라고 합니다.sprintf_s
언급URL : https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
'programing' 카테고리의 다른 글
동적 외부 데이터를 반응적으로 처리하도록 VueJ/VueX 애플리케이션을 구성하는 방법 (0) | 2022.08.14 |
---|---|
잭슨 - 범용 클래스를 사용하여 역직렬화 (0) | 2022.08.14 |
Java에서 public, protected, package-private 및 private의 차이점은 무엇입니까? (0) | 2022.08.14 |
vuex 파일을 분할하려면 어떻게 해야 합니까? (0) | 2022.08.14 |
세미콜론 및 IF/WHILE/FOR 문이 없는 C의 hello world (0) | 2022.08.14 |