Extending CStringArray

Environment: VC6 SP3, NT4 SP4

One of the reasons I left C and began to use C++ was CString and even more so CStringArray. These two classes are worth
all the other aggravation when going OO. I don’t claim that they are perfect. There are things missing in both of
those classes and I would like to share this extension of CStringArray that I have made.

Finding an string in a CStringArray

One of the things that I think are missing in CStringArray is a Find method. I find myself wanting to get a specific string out of the array
and I know part, or the whole, of it. Not the position in the array. So I added this method. It is very straight forward and uses
CString::Find to find the string.

Example:


 meStringArray arr;

 // fill the array with strings using the normal Add()
 arr.Add("This is a String");
 arr.Add("The second string");
 arr.Add("the 3:rd string");

 // find the third string
 int i=arr.Find("3:rd");

 // i is now 2
 CString sBuf;

 sBuf=arr.GetAt(i);

 // sBuf has now the value of "the 3:rd string"

Array of NULL terminating strings

Some SDK-functions and some classes still using an array of NULL terminating strings. e.g. CFileDialog uses this kind of array
for the filters. GetProfileString(“section”,NULL,””,buf,sizeof(buf)); also uses it, and there are many more. So every time you need to use
this class/function you have to go back to C and do a lot of loops. Well I finally got tired of it and extended CStringArray with two methods;
AddBuf() and GetBuf(). The first will take an array of NULL terminating strings and add it to the StringArray, and the second will do the reverse

Example GetBuf:


 CFileDialog dlg;
 meStringArray filter;

 // init filter
 filter.Add("All files");
 filter.Add("*.*");
 filter.Add("Doc files");
 filter.Add("*.doc");
 filter.Add("Text files");
 filter.Add("*.txt");

 // Init file dialog
 dlg.m_ofn.lpstrFilter=filter.GetBuf();
 dlg.m_ofn.lpstrInitialDir=initDir;
 dlg.m_ofn.Flags |= OFN_SHAREAWARE;
 int rc=dlg.DoModal();
 if(rc==IDOK)
 {
  m_filepath=dlg.GetPathName();
  UpdateData(FALSE);
 }

Example AddBuf:


 meStringArray arr;
 char buf[1024];

 // Get all printer names
 GetProfileString("devices",NULL,"",buf,sizeof(buf));

 // add them to the array
 arr.AddBuf(buf);

 // Get the second printer name from the array
 CString sPrintName = arr.GetAt(2);

Well that’s it! It’s not a very large class so there is not so much to say.
I hope that someone will find use for this and PLEASE let me know what you think!
This is the first class I ever published so please say what you think about it, good, bad.

Downloads

Download source – 2 KB

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read