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: "part1\0part2\0part3\0\0".
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=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:04am

    how can you display ex. 234578E, in parts of as
    23
    45
    78
    E
      when it is pases to a function

    Reply
  • Or you could just use std::string...

    Posted by Legacy on 08/09/2002 12:00am

    Originally posted by: DrPizza

    ... which is a counted string, not a null-terminated string.

    Reply
  • How about a C version?

    Posted by Legacy on 11/21/2000 12:00am

    Originally 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
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: March 19, 2015 @ 1:00 p.m. ET / 10:00 a.m. PT The 2015 Enterprise Mobile Application Survey asked 250 mobility professionals what their biggest mobile challenges are, how many employees they are equipping with mobile apps, and their methods for driving value with mobility. Join Dan Woods, Editor and CTO of CITO Research, and Alan Murray, SVP of Products at Apperian, as they break down the results of this survey and discuss how enterprises are using mobile application management and private …

  • This report outlines the future look of Forrester's solution for security and risk (S&R) executives working on building an identity and access management strategy for the extended enterprise. We designed this report to help you understand and navigate the major business and IT trends affecting identity and access management (IAM) during the next five years. IAM in 2012 has become a tool not just for security but also for business agility. Competitive challenges push businesses into the cloud and encourage …

Most Popular Programming Stories

More for Developers

RSS Feeds

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