# Find all occurrences of a sub string in a string | CPP | Both Case Sensitive & InSensitive

In the previous article, we have discussed about Find and Replace all occurrences of a sub string in C++. Let us learn how to find all occurrences of a sub string in a string in C++ Program.

## Finding all occurrences of a sub string in a string both Case Sensitive & InSensitive in C++

### Find All Case occurrences of a Sub String in a given String- Case Sensitive :

We will use std::string::find to search the first occurrence then go on searching like this upto last.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

void hasOccuredAtIndex(std::vector<size_t> &vec, std::string str, std::string subStr)
{
// Adding the first occurence of the substring to the vector
size_t loc = str.find(subStr);
while (loc != std::string::npos)
{
vec.push_back(loc);
//Finding and adding the ext occurence of the substring
loc = str.find(subStr, loc + subStr.size());
}
}

int main(int argc, char const *argv[])
{
std::string str = "We are going through an example. We will be seeing how many times the word \'we\' occurs";
std::string subStr = "We";
std::vector<size_t> vec;
hasOccuredAtIndex(vec, str, subStr);
//The string and substring were passed with a vector which will store the indices of occurence
std::cout << "The indices where the string \"" << subStr << "\" has occured" << std::endl;
for (size_t loc : vec)
std::cout << loc << std::endl;
return 0;
}


Output :
The indices where the string "We" has occured
0
33

The find( ) function is case-sensitive so we could only get the indices of two occurrences of our substring.

### Find all occurrence of a Sub String in a given String- Case Insensitive :

Here we are going to use the same approach as the previous example but we will modify the find( ) function to make it case insensitive. We will modify it by creating another function that will take the string and convert them to a lowercase which will solve our case issue.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

size_t modifiedFind(std::string str, std::string subStr, size_t loc = 0)
{
// Converting the whole string into lower case
std::transform(str.begin(), str.end(), str.begin(), ::tolower);

std::transform(subStr.begin(), subStr.end(), subStr.begin(), ::tolower);
return str.find(subStr, loc);
}

void hasOccuredAtIndex(std::vector<size_t> &vec, std::string str, std::string subStr)
{

// Adding the first occurence of the substring to the vector
size_t loc = modifiedFind(str, subStr);
while (loc != std::string::npos)
{
vec.push_back(loc);
//Finding and adding the ext occurence of the substring
loc = modifiedFind(str, subStr, loc + subStr.size());
}
}

int main(int argc, char const *argv[])
{
std::string str = "We are going through an example. we will be seeing how many times the word \'We\' occurs";
std::string subStr = "We";
std::vector<size_t> vec;
hasOccuredAtIndex(vec, str, subStr);
//The string and substring were passed with a vector which will store the indices of occurence
std::cout << "The indices where the string \"" << subStr << "\" has occured" << std::endl;
for (size_t loc : vec)
std::cout << loc << std::endl;
return 0;
}

Output :
The indices where the string "We" has occured
0
33
76

Now we can see the modified program has become case insensitive and displays all the occurrences of our substring.