Solved

Creating a Character Pointer Array?

Posted on 2007-04-03
7
1,112 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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

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…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

920 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

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now