Solved

Counting the number of tokens in a String.

Posted on 2007-03-29
9
313 Views
Last Modified: 2010-04-15
I've been messing around trying to get the most efficient possible method and here is what I have:

const char *String_Contains(const char *s1, const char *s2)
{
  int s1Len = String_Length(s1);
  int s2Len = String_Length(s2);
  for(; s1Len >= s2Len; ++s1, --s1Len)
  {
    if(String_BeginsWith(s1, s2))
      return s1;
  }
  return NULL;
}

What I do is pass in 2 strings, 1 is a full string, while the other is a string containing seperators. Then I loop through and count the number of times I find a seperator and return them as a char.

Any improvements or errors that I may have
0
Comment
Question by:directxBOB
  • 4
  • 4
9 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 18820806
I don't see where you count the number of times you find a seperator
0
 

Author Comment

by:directxBOB
ID: 18820853
Sorry the count is another method, I've been trying to change the code so it's far more re-usable.
0
 
LVL 84

Accepted Solution

by:
ozo earned 450 total points
ID: 18820869
You can count separators with
int countseperators (const char *s, const char *charset){
  int count=0;
  while( s=strpbrk(s, charset) ){ s++; count++; }
  return count;
}
but that may not be the same as the number of tokens if there can be multiple separators between tokens or leading or trailing tokens
0
 

Author Comment

by:directxBOB
ID: 18820908
Ok well I can use:

int String_FindDelimiter(const char *pString, const char *pDelimiters)
{
  int i,j;
  for (i=0;pString[i];++i)
  {
    for (j=0;pDelimiters[j];++j)
      if (pString[i] == pDelimiters[j])
        return i;
  }
  return i; // No delimiter found, return remaining string length
}

This will return the position of the delimiter in the character list, thus I guess I could pass in that string into:

int countseperators (const char *s, const char *charset){
  int count=0;
  while( s=strpbrk(s, charset) ){ s++; count++; }
  return count;
}
0
Want to promote your upcoming event?

Attending an event? Speaking at a conference? Or exhibiting at a trade show? Easily inform your contacts by using a promotional banner in your email signature. This will ensure your organization’s most important contacts are in the know.

 
LVL 84

Assisted Solution

by:ozo
ozo earned 450 total points
ID: 18820925
If you are going to do this many times with the same set of delimiters you might set up an array do you can do
if( isdelimiter[pString[i]] )
0
 

Author Comment

by:directxBOB
ID: 18821049
How would I fit the above calls into the following:

    pCE->pEventCallback(pEditorScript, pAIEv->pParameter ? 1 : 0, pAIEv->pParameter ? &pAIEv->pParameter : NULL, pCE->pUserData);

so basically I want to find what the seperator is, then use it and count the number of seperators, and use that in:

    pCE->pEventCallback(pEditorScript, pAIEv->pParameter ? 1 : 0, pAIEv->pParameter ? &pAIEv->pParameter : NULL, pCE->pUserData);

0
 
LVL 84

Expert Comment

by:ozo
ID: 18821752
where in pCE->pEventCallback(pEditorScript, pAIEv->pParameter ? 1 : 0, pAIEv->pParameter ? &pAIEv->pParameter : NULL, pCE->pUserData); do you want to use the number of separators?
0
 
LVL 45

Assisted Solution

by:Kdo
Kdo earned 50 total points
ID: 18825117
Hello directxBOB,

If you really want to most efficient way, you should check out other algorithms.  Some of them are quite a drastic change from what we're taught and what you're probably used to.

The Boyer-Moore algorithm is exceptionally good on very long text.  Because of the start-up overhead, it's not particularly effective on short buffers.  Then again, for short buffers, the time required even for brute force is imperceptible to the human eye.

Here's a link to a pretty good description.  You can google "Boyer Moore" for lots more.

  http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm

Good Luck,
Kent
0
 

Author Comment

by:directxBOB
ID: 18833565
where in pCE->pEventCallback(pEditorScript, pAIEv->pParameter ? 1 : 0, pAIEv->pParameter ? &pAIEv->pParameter : NULL, pCE->pUserData); do you want to use the number of separators?



Well I was of the assumption that the best place to use it would be where 1 is, so that there can be more than 1 Parameter. I really hate how the above is written but have to make do.
0

Featured Post

Superior storage. Superior surveillance.

WD Purple drives are built for 24/7, always-on, high-definition security systems. With support for up to 8 hard drives and 32 cameras, WD Purple drives are optimized for surveillance.

Question has a verified solution.

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

Suggested Solutions

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…
Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.

930 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