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)",
                  nAnInteger,
                  szAZeroTerminatedString));

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;
}

Downloads

You can cut & paste code from above.



Comments

  • 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.

    Reply
  • 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;
    }

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

Top White Papers and Webcasts

  • On-demand Event Event Date: May 18, 2015 While the idea of using facial and/or gesture recognition to create a modern, intuitive game seems attractive, some developers may want to leverage Unity 3D as a way to accelerate their development efforts. There are many different ways in which Intel and Unity Technologies have been working together to help speed the development of games with the Intel&reag; RealSense™ SDK (software developer kit). Check out this webcast to join a panel of experts as they …

  • On-Demand eSeminar DevOps and Cloud are all the rage in IT, but the two terms relating process and computing aren't mutually exclusive. Join us to see how your movement into cloud changes the way you develop, deploy, test and manage, and how DevOps can actually be a good thing when coupled with cloud.

Most Popular Programming Stories

More for Developers

RSS Feeds

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