Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

iterate char by char through vector of strings

I want to iterate char by char in a vector of strings. In my code I created a nested loop to iterate over the string, but somehow I get an out of range vector.

void splitVowFromCons(std::vector<std::string>& userData, std::vector<std::string>& allCons, std::vector<std::string>& allVows){
    for ( int q = 0; q < userData.size(); q++){
        std::string userDataCheck = userData.at(q);
        for ( int r = 0; r < userDataCheck.size(); r++){
            if ((userDataCheck.at(r) == 'a') || (userDataCheck.at(r) == 'A') || (userDataCheck.at(r) == 'e') || (userDataCheck.at(r) == 'E') || (userDataCheck.at(r) == 'i') || (userDataCheck.at(r) == 'I') || (userDataCheck.at(r) == 'o') || (userDataCheck.at(r) == 'O') || (userDataCheck.at(r) == 'u') || (userDataCheck.at(r) == 'U')){
                allVows.push_back(userData.at(r));
            }
            else if ((userDataCheck.at(r) >= 'A' && userDataCheck.at(r) <= 'Z') || (userDataCheck.at(r) >= 'a' && userDataCheck.at(r) <= 'z')){
                allCons.push_back(userData.at(r));
            }
            else {
                continue;;
            }
        }
    }
}

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

The error here is in these lines:

allVows.push_back(userData.at(r));
allCons.push_back(userData.at(r));

the r variable is your index into the current string, but here you’re using it to index into the vector, which looks like a typo to me. You can make this less error prone using range-for loops:

for (const std::string& str : userData) {
    for (char c : str) {
        if (c == 'a' || c == 'A' || ...) {
            allVows.push_back(c);
        }
        else if (...) {
            ....
        }
    }
}

which I hope you’ll agree also has the benefit of being more readable due to less noise. You can further simplify your checks with a few standard library functions:

for (const std::string& str : userData) {
    for (char c : str) {
        if (!std::isalpha(c)) continue; // skip non-alphabetical
        char cap = std::toupper(c); // capitalise the char
        if (cap == 'A' || cap == 'E' || cap == 'I' || cap == 'O' || cap == 'U') {
            allVows.push_back(c);
        }
        else {
            allCons.push_back(c);
        }
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading