A class for double zeroterminated strings
Posted
by Gert Rijs
on August 22nd, 1998
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: "part1\0part2\0part3\0\0".
To name just a few of functions that work with DZ strings:
- GetPrivateProfileSection
- WritePrivateProfileSection
- SQLConfigDataSource
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=1\0b=2\0c=3\0\0"
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\0" "b=2\0" "c=3\0" "\0", 13);
// or some prefer:
CString dz("a=1@b=2@c=3@@");
int pos;
// note that you MUST use ReverseFind (not Find) for this to work
while((pos=dz.ReverseFind("@"))!=-1)
dz.SetAt(pos, '\0');
Last updated: August 17, 1998

Comments
hi
Posted by lexito on 05/23/2008 11:04amOr you could just use std::string...
Posted by Legacy on 08/09/2002 12:00amOriginally posted by: DrPizza
... which is a counted string, not a null-terminated string.
ReplyHow about a C version?
Posted by Legacy on 11/21/2000 12:00amOriginally posted by: David Duncan Ross Palmer
Are you a C++ programmer who hates C?
If not how about a C version of this, that would be useful.
For example a structure of pointers to C functions and of course manually passing >this< pointers. Or alternatively non-OOP altogether such as a library of functions for dealing with these types of strings.
Reply