Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Counting words in a string

I am learning C++ on my own. I have written this program to count the number of words in a string. I know it's not the best way to do this, but this was what I could think of.

I am using spaces to count the number of words. Here is the problem.

countWords("");   // ok, 'x.empty()' identifies it as an empty string.
countWords("  "); // 'x.empty()' fails, function returns 1.

p.s I want this program to not count symbols like, "!","?" as words. Here is my code:

#include <iostream>
#include <string>

int countWords(std::string x);

int main() {
    std::cout << countWords("Hello world!");
}

int countWords(std::string x) {
    if(x.empty()) return 0; // if the string is empty
    int Num = 1;              

    for(unsigned int i = 0; i < x.size(); i++) {
        // if there is a space in the start
        if(x[0] == ' ') continue;

        // second condition makes sure that i don't count 2 spaces as 2 words
        else if(x[i] == ' ' && x[i - 1] != ' ') Num++;
    }
    return Num;
}
like image 381
user3834119 Avatar asked Feb 03 '26 05:02

user3834119


2 Answers

Your function can be reduced to this:

int countWords(std::string x) {

    int Num = 0;      
    char prev = ' ';

    for(unsigned int i = 0; i < x.size(); i++) {

        if(x[i] != ' ' && prev == ' ') Num++;

        prev = x[i];
    }
    return Num;
}

Here is a demo

Edit: To follow up comment:

Here is a simple way to replace other characters with ' ', thought there might be a build method for this:

void replace(std::string &s, char replacer, std::set<char> &replacies)
{
    for (int i=0; i < s.size(); i++)
        if (replacies.count(s[i])) s[i] = replacer;

}

demo

like image 186
Akavall Avatar answered Feb 04 '26 19:02

Akavall


The problem with your answer is that you are counting the number of words after which there is a ' ' sign. I believe you start with Num = 1 because you won't be counting the last word. Hovewer that only occurs when the string youre analysing does not end with ' '. Otherwise you will have 1 more word counted. The easiest way to fix this is to add

if(x.back() == ' ')
    Num--;

right before returning the answer.

like image 43
Silnik Avatar answered Feb 04 '26 17:02

Silnik



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!