Finding all occurrences of a character in a string

23,521

Solution 1

vector<int> findLocation(string sample, char findIt)
{
    vector<int> characterLocations;
    for(int i =0; i < sample.size(); i++)
        if(sample[i] == findIt)
            characterLocations.push_back(sample[i]);

    return characterLocations;
}

As currently written, this will simply return a vector containing the int representations of the characters themselves, not their positions, which is what you really want, if I read your question correctly.

Replace this line:

characterLocations.push_back(sample[i]);

with this line:

characterLocations.push_back(i);

And that should give you the vector you want.

Solution 2

If I were reviewing this, I would see this and assume that what you're really trying to do is tokenize a string, and there's already good ways to do that.

Best way I've seen to do this is with boost::tokenizer. It lets you specify how the string is delimited and then gives you a nice iterator interface to iterate through each value.

using namespace boost;
string sample = "Hello,My,Name,Is,Doug";
escaped_list_seperator<char> sep("" /*escape char*/, ","/*seperator*/, "" /*quotes*/)

tokenizer<escaped_list_seperator<char> > myTokens(sample, sep)

//iterate through the contents
for (tokenizer<escaped_list_seperator<char>>::iterator iter = myTokens.begin();
     iter != myTokens.end();
     ++iter)
{
    std::cout << *iter << std::endl;
}

Output:

Hello
My
Name
Is
Doug

Edit If you don't want a dependency on boost, you can also use getline with an istringstream as in this answer. To copy somewhat from that answer:

std::string str = "Hello,My,Name,Is,Doug";
std::istringstream stream(str);
std::string tok1;

while (stream)
{
    std::getline(stream, tok1, ',');
    std::cout << tok1 << std::endl;
}

Output:

 Hello
 My
 Name
 Is
 Doug

This may not be directly what you're asking but I think it gets at your overall problem you're trying to solve.

Share:
23,521
lodkkx
Author by

lodkkx

Updated on October 12, 2020

Comments

  • lodkkx
    lodkkx over 3 years

    I have comma delimited strings I need to pull values from. The problem is these strings will never be a fixed size. So I decided to iterate through the groups of commas and read what is in between. In order to do that I made a function that returns every occurrence's position in a sample string.

    Is this a smart way to do it? Is this considered bad code?

    #include <string>
    #include <iostream>
    #include <vector>
    #include <Windows.h>
    
    using namespace std;
    
    vector<int> findLocation(string sample, char findIt);
    
    int main()
    {
        string test = "19,,112456.0,a,34656";
        char findIt = ',';
    
        vector<int> results = findLocation(test,findIt);
        return 0;
    }
    
    vector<int> findLocation(string sample, char findIt)
    {
        vector<int> characterLocations;
        for(int i =0; i < sample.size(); i++)
            if(sample[i] == findIt)
                characterLocations.push_back(sample[i]);
    
        return characterLocations;
    }