Solved

Creating a Character Pointer Array?

Posted on 2007-04-03
7
1,118 Views
Last Modified: 2012-06-27
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)
0
Comment
Question by:directxBOB
  • 3
  • 2
7 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 18848040
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
 
LVL 86

Expert Comment

by:jkr
ID: 18848052
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
 

Author Comment

by:directxBOB
ID: 18848247
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
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 
LVL 86

Accepted Solution

by:
jkr earned 250 total points
ID: 18848265
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
 
LVL 16

Assisted Solution

by:PaulCaswell
PaulCaswell earned 250 total points
ID: 18856367
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
 

Author Comment

by:directxBOB
ID: 19205384
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

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question