Mostafa Anwar
Mostafa Anwar

Reputation: 21

Sub-strings and delimiters

I'm trying to get a sentence delimited by certain characters (either a space, comma, or a dot) to check if it's a palindrome. If the input is "hello,potato.", I'll check this symmetry on "hello" alone and then potato alone.

The problem is, while I'm doing the first iteration of the loop that searches for the delimiter, the word "hello" is stored in the sub-sentence, but on the second iteration the word that should be stored as "potato" will be "potato.". And I am unable to remove the "." delimiter from the end of the input string.

for(int i=0;i<sentence.length();i++)
      {
        if(sentence[i]==' '||sentence[i]=='.'||sentence[i]==',')
        { //the couts is just to help me debug/trace
                cout<<"i is now : "<<i<<endl;
                if(i==delindex && i==sentence.length()-1)
                {
                 subsentence=sentence.substr(temp+1,subsentence.length()-1);
                }
                else
                {
                    subsentence=sentence.substr(delindex,i);
                    cout<<subsentence<<endl;
                    temp=delindex-1;
                    delindex=i+1;
                }
        }
      }

What would be the best way to go about this?

Upvotes: 0

Views: 73

Answers (1)

Killzone Kid
Killzone Kid

Reputation: 6240

god bless you man that strtok is what i have been looking for

Actually, you don't need strtok (and should probably avoid it for various safety reasons), as std::string has a wonderful method called find_first_of which acts pretty much like strtok, as in it accepts a bunch of chars and returns index when it stumbles on any of the chars. However to make robust tokenizer a combination of find_first_of and find_first_not_of is more suitable in this case.

Therefore you could simplify your token searching to:

#include <iostream> 
#include <string>

int main()
{
    std::string sentence = "hello,potato tomato.";
    std::string delims = " .,";

    size_t beg, pos = 0;
    while ((beg = sentence.find_first_not_of(delims, pos)) != std::string::npos)
    {
        pos = sentence.find_first_of(delims, beg + 1);
        std::cout << sentence.substr(beg, pos - beg) << std::endl;
    }
}

https://ideone.com/rhMyvG

Upvotes: 2

Related Questions