[질문] 리눅스 유닉스에서 vscprintf

bizzare의 이미지

윈도우에서 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가 없더군요 -_-;
빌드하려고 하니 에러가 나더군요.

아주 일반적인 함수이기때문에 이름은 다르더라도 이런 기능의 함수는 존재할 것 같은데,
어떤 것이 있는지 알고 싶습니다.

kslee80의 이미지

해당 함수는 Win32 플랫폼에서만 존재하는 함수입니다.
MSDN 에서 해당 함수의 Compatibility 항목을 보니, Win95 ~ Win2003 까지라고 표기되어 있군요.
(개인적인 생각으로는 Visual Studio 에서만 존재하지 않을까 싶긴 합니다. 확신은 못하겠군요)

P.S.) 그나저나 글에 쓴 코드가 vsctprintf 심볼에 대한 에러만을 표시하던가요?
Visual Studio 에서만 사용되는 매크로들이 보이는군요...(LPCTSTR, TCHAR)

BeEye의 이미지

_ 붙은건 아직 표준화 되지 않은 함수라고 어디선가 들은 듯한 기억이...

대신 vprintf 이런거 쓰면되지않나요? linux나 unix에선 딱히 char, tchar 구분 안하고 막써도 별 문제 없었던거 같은데...

전 Format 용도로 sprintf를 썼는데. 좀 다른가요?

+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+

+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+

bizzare의 이미지

그냥 sprintf를 쓰면 안되는 이유는

예를 들어서 str.Format(_T("%s, %D"), str, iVal); 이라는 구문이 있을 때,
str의 결과물의 길이를 알 수 없다는 점입니다.

sprintf에서 format의 결과를 보관할 character의 array가 사용되는데,
대부분의 예제에서는
char ch[1024]; 와 같이 적당히 메모리를 할당해서 사용하지요.
하지만 1024가 넘는 경우는 어떻게 해야할까요?
그렇다고해서 char ch[10000]으로 하는 것이 해결책은 아니죠.
10000자 이상이면 어차피 문제가 되니까요

그래서 length를 미리 알아내서 동적으로 잘 동작하게 만들고 싶은 것이 저의 목적입니다.

window에서는 위의 함수를 이용하면 동작하는 것을 알았는데, 리눅스, 유닉스에선 어떻게 해야하는지 모르겠더군요.

정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.

정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.

doldori의 이미지

이런 기능을 하는 C99의 표준 함수는 snprintf()/vsnprintf()입니다.
http://kldp.org/node/72687#comment-341702을 참고하십시오.
그러나 VC는 C99를 지원하지 않기 때문에 이러한 함수를 쓸 수 없고
환경 의존적인 _sctprintf()/_vsctprintf()를 쓰는 것입니다.

앗, 다시 보니 C++이네요. 그럼 stringstream 같은 걸 놔두고 왜 험한 길을 가시는지...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.