Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Creating a Character Pointer Array?

Posted on 2007-04-03
7
1,121 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
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
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

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Path to  STL Map header file 1 69
Raspberry Pi 3 to send text message 9 151
Why  my code (program) build with old compiler? 11 77
Adding items to a C# list incrementally 5 33
When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.

829 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