CString instead of LPCSTR

A simple routine to allow CString formatted strings to be used wherever a regular LPCSTR would be used, without needing to define a CString (ie, dynamically created and formatted LPCSTR strings)


Environment: VC6 SP4

Well, I've seen other people asking for a class like this, and I sure wanted one, so I finally wrote one.

Suppose you want to call a routine with a dynamically constructed LPCSTR. You would call it like this:

SampleRoutine( (LPCSTR) csFMT(
                  "Sample dynamic string count(%d) name(%s)",

The Microsoft CString class provides a Format member routine which provides sprintf-type formatting, without the need to allocate a buffer. The class CString automatically calculates the size of the buffer required, and allocates it. A CString variable, however, must first be declared. This routine allows the CString Format member routine to be used, without needing to declare a CString.

Here is the sample code without using the "csFmt" routine:

  CString csTemp;
  CsTemp.Format("Sample dynamic string count(%d) name(%s)",
                nAnInteger, szAZeroTerminatedString);
  SampleRoutine((LPCSTR) csTemp);

This method doesn't require any subclassing, and is only a short < 10 line routine.

CString csFMT(LPCSTR lpszFormat, ...)
    CString csStr;

    va_list argList;
    va_start(argList, lpszFormat);
    csStr.FormatV(lpszFormat, argList);
    return csStr;


You can cut & paste code from above.


  • If only Format whould ??

    Posted by Legacy on 06/04/2002 12:00am

    Originally posted by: Boaz Harrosh

    If CString::Format was defined as
    CString& AFX_CDECL Format(LPCTSTR lpszFormat, ...);
    and not:
    void AFX_CDECL Format(LPCTSTR lpszFormat, ...);

    than we could just do:
    cout << (LPCSTR)CString().Format("%s" ,"yes it works this way") ;

    A constructor is callable in C++. It is just like a type cast.

  • Another way

    Posted by Legacy on 04/17/2002 12:00am

    Originally posted by: Mathieu Fr.

    You can also do such a thing. No cstring. no alloc.
    Of course there are restrictions due to the static buffer, but SPEED matters sometimes (and mem alloc too) !

    LPCSTR poil(LPCSTR lpszFormat, ...)
    const char buff[1000];
    va_list argList;
    va_start(argList, lpszFormat);
    vsprintf( buff, lpszFormat, argList );
    return buff;

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Moving from an on-premises environment to Office 365 does not remove the need to plan for disruptions or reduce the business risk requirements for protecting email services. If anything, some risks increase with a move to the cloud. Read how to ease the transition every business faces if considering or already migrating to cloud email. This white paper discusses: Setting expectations when migrating to Office 365 Understanding the implications of relying solely on Exchange Online security Necessary archiving …

  • Enterprises are increasingly looking to platform as a service (PaaS) to lower their costs and speed their time to market for new applications. Developing, deploying, and managing applications in the cloud eliminates the time and expense of managing a physical infrastructure to support them. PaaS offerings must deliver additional long-term benefits, such as a lower total cost of ownership (TCO), rapid scalability, and ease of integration, all while providing robust security and availability. This report …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date