[질문] 리눅스 유닉스에서 vscprintf
글쓴이: bizzare / 작성시간: 목, 2006/08/17 - 4:42오후
윈도우에서 string의 format 기능을 구현하려고 할 때,
( CString::Format(~~~)과 같은 )
다음과 같이 구현했습니다.
LPCTSTR FormatS(LPCTSTR lpszFormat , ...)
{
va_list argList;
va_start( argList, lpszFormat );
{
//format후의 string의 길이를 구한다
int nLength = _vsctprintf( lpszFormat, argList );
//길이에 맞는 메모리를 할당받고
TCHAR* pBuff = new TCHAR[nLength+1];
//string 생성
_vstprintf(pBuff, lpszFormat, argList);
_string = pBuff;
delete [] pBuff;
}
va_end( argList );
return _string.c_str();
}
그런데, 리눅스, 유닉스에서는 _vsctprintf가 없더군요 -_-;
빌드하려고 하니 에러가 나더군요.
아주 일반적인 함수이기때문에 이름은 다르더라도 이런 기능의 함수는 존재할 것 같은데,
어떤 것이 있는지 알고 싶습니다.
Forums:
Re: 일반적인 함수가 아닙니다.
해당 함수는 Win32 플랫폼에서만 존재하는 함수입니다.
MSDN 에서 해당 함수의 Compatibility 항목을 보니, Win95 ~ Win2003 까지라고 표기되어 있군요.
(개인적인 생각으로는 Visual Studio 에서만 존재하지 않을까 싶긴 합니다. 확신은 못하겠군요)
P.S.) 그나저나 글에 쓴 코드가 vsctprintf 심볼에 대한 에러만을 표시하던가요?
Visual Studio 에서만 사용되는 매크로들이 보이는군요...(LPCTSTR, TCHAR)
그냥...
_ 붙은건 아직 표준화 되지 않은 함수라고 어디선가 들은 듯한 기억이...
대신 vprintf 이런거 쓰면되지않나요? linux나 unix에선 딱히 char, tchar 구분 안하고 막써도 별 문제 없었던거 같은데...
전 Format 용도로 sprintf를 썼는데. 좀 다른가요?
+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+
+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+
이 질문의 목적
그냥 sprintf를 쓰면 안되는 이유는
예를 들어서 str.Format(_T("%s, %D"), str, iVal); 이라는 구문이 있을 때,
str의 결과물의 길이를 알 수 없다는 점입니다.
sprintf에서 format의 결과를 보관할 character의 array가 사용되는데,
대부분의 예제에서는
char ch[1024]; 와 같이 적당히 메모리를 할당해서 사용하지요.
하지만 1024가 넘는 경우는 어떻게 해야할까요?
그렇다고해서 char ch[10000]으로 하는 것이 해결책은 아니죠.
10000자 이상이면 어차피 문제가 되니까요
그래서 length를 미리 알아내서 동적으로 잘 동작하게 만들고 싶은 것이 저의 목적입니다.
window에서는 위의 함수를 이용하면 동작하는 것을 알았는데, 리눅스, 유닉스에선 어떻게 해야하는지 모르겠더군요.
정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.
정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.
이런 기능을 하는
이런 기능을 하는 C99의 표준 함수는 snprintf()/vsnprintf()입니다.
http://kldp.org/node/72687#comment-341702을 참고하십시오.
그러나 VC는 C99를 지원하지 않기 때문에 이러한 함수를 쓸 수 없고
환경 의존적인 _sctprintf()/_vsctprintf()를 쓰는 것입니다.
앗, 다시 보니 C++이네요. 그럼 stringstream 같은 걸 놔두고 왜 험한 길을 가시는지...
댓글 달기