A class for double zeroterminated strings

Download Source Code and Example

There are several win32 functions that require the use of a string with embedded
NULLs and are terminated with an extra NULL (i will call them DZ strings for short).
An example of such a DZ string: “part1part2part3”.
To name just a few of functions that work with DZ strings:

  • GetPrivateProfileSection
  • WritePrivateProfileSection
  • SQLConfigDataSource

As most string-functions (strcmp, strchr etc) expect a zeroterminated string, they are of little use when
you have to parse a DZ string.
The CString class could be used to manipulate them, but you must be carefull not to call the non-DZ-aware
CString-methods (such as Right(), Mid(), Left(), Replace() and Find()).
I decided to create a class that helps constructing and parsing those DZ strings.
The class is called CDoubleZeroString and is not derived from CString.

An example how to use this class:


CDoubleZeroString dz;
dz.Add(“a=1”); // add a zeroterminated ‘part’
dz.Add(“b=2”);
dz.Add(“c=3”);
// operator(const char*) will return “a=1b=2c=3”
WritePrivateProfileSection(“humbug”, dz, “.\humbug.ini”);
char buffer[1024];
GetPrivateProfileSection(“humbug”, buffer, sizeof buffer, “.\humbug.ini”);
// cleanup dz
dz.Empty();
// AddDoubleZero will parse buffer
dz.AddDoubleZero(buffer);
// print the outcome
for(int i=0;i<dz.GetCount();i++)
cout << dz.Get(i) << endl;
CString test = dz;
cout << “cstring ” << test << endl;

This will show the following output:
a=1
b=2
c=3
cstring a=1

The CString test will only copy the first substring when it is constructed…

If you want to implement this using CString you would have to do something like:


CString dz(“a=1” “b=2” “c=3” “”, 13);
// or some prefer:
CString dz(“[email protected][email protected][email protected]@”);
int pos;
// note that you MUST use ReverseFind (not Find) for this to work
while((pos=dz.ReverseFind(“@”))!=-1)
dz.SetAt(pos, ‘’);

Last updated: August 17, 1998

More by Author

Must Read