Creating a Character Pointer Array?

I've been working on messing with some strings, what I have at the momment is:

int String_CountSeperators(const char *pString, int c)
{

  int count = 0;
      do
      {
                if(*pString == (char)c)
                    {
                       count++;
                     }
      }
      while(*pString++);

      return count;
}



How would I convert this so that I would pass in a seperator (C is the location of the first seperator) then store a pointer to the first position of each new param (basically the position just after each seperator).

I would assume I would need an array, and as I iterate through this, I would have to place the pointer to each param into the array.

(Again I am probably talking C# or Java terms, so if I am not making sense please just ask me to re-explain)
directxBOBAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

jkrCommented:
The easiest idea would be to not reinvent the wheel and use 'strtok()', which does exactly that, i.e.

#include <string.h>

char** String_GetSubstringFromSeperators(const char *pString, int c)
{

  int count = String_CountSeperators(pString,c);
  char** pSubs = new char*[count];

  char seps[2];
  sprintf(seps,"%c",(char)c);

  char* token = strtok(pString,seps);
  int n = 0;

  while(token != NULL) {

    pSubs[i] = token;

    token = strtok(NULL,seps);

    ++i;

  }

  return pSeps;
}
0
jkrCommented:
Oh, and also a pure C++ solution:

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int split_text(string strIn, const char cDelim, vector<string>& vResult) {

   int nPos = 0;
   int nCount = 0;
   int nFound;
   string strToken;

   while(1) {

      nFound = strIn.find(cDelim,nPos);

      if (-1 == nFound)  {

        strToken = strIn.substr(nPos,strIn.length() - nPos);
        vResult.push_back(strToken);
        break;
      }

      strToken = strIn.substr(nPos,nFound - nPos);

      nPos = nFound + 1;

      ++nCount;

      vResult.push_back(strToken);

   }

   return nCount;
}

int main () {

  vector<string> vResult;

   int n = split_text("12456256|name|354||m|MN",'|',vResult);

   for ( int i = 0; i < n; ++i)
      cout << vResult[i] << endl;
}
0
directxBOBAuthor Commented:
trying to do this all without using things like strtok, as I want to really try and get to grips with working faster and more efficiently with C / C++
0
Bootstrap 4: Exploring New Features

Learn how to use and navigate the new features included in Bootstrap 4, the most popular HTML, CSS, and JavaScript framework for developing responsive, mobile-first websites.

jkrCommented:
Not using 'strtok()' is not a big deal:

char** String_GetSubstringFromSeperators(const char *pString, int c)
{

  int count = String_CountSeperators(pString,c);
  char** pSubs = new char*[count];
  int n = 0;

  char* pLast = pString;

  while(*pString++) {

    if ( *pString = (char)c) {

        *pString = '\0'; // null-terminate substring
        pSubs[i] = pLast;
        ++i;
        pLast = pString;
    }
  }

  return pSeps;
}
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
PaulCaswellCommented:
The answer is to pass an array of char * to hold the list. Something like:

int String_CountSeperators(const char *pString, int c, char * params[], int max)
{

  int count = 0;
      do
      {
                if(*pString == (char)c)
                    {
                       params[count++] = pString+1;
                     }
      }
      while(*pString++ && count < max);

      return count;
}

But remember that each parameter will not be null-terminated.

Paul
0
directxBOBAuthor Commented:
Sorry for the delay in this lads, I wasn't able to get it working and got sidetracked with build machines. Anyway I split the points and again my apologies for the delay.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.