Convert First Letter of Each Word of a String to Upper Case in CPP

Strings:

The declaration and description of a string using an array of chars are the same as the declaration and definition of any other data type array.

Any string must end with the null character ‘/0′. As the last element of an array specified in this manner, the null character ‘/0′ should be used.

Given a string ,the task is to convert the first letter of each word in the given string to uppercase

Example:

Example 1:

Input:

given_string="hello this is btechgeeks"

Output:

Hello This Is BTechgeeks

Example 2:

Input:

given_string="miss World"

Output:

Miss World

Explanation :

 Here second word "world" is already capitalized

Convert First Letter of Each word in a String to Uppercase

There are several ways to convert the first letter of each word in a string to uppercase some of them are:

Method #1:Using STL functions

Approach/Algorithm:

  • Iterate through the characters in the specified string.
  • Check for each character – if the previous character was ‘ ‘ and the current character is not ‘ ‘
  • If yes, change the letter to upper case.

Below is the implementation:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    // given string
    string given_string = "hello this is btechgeeks";

    // Traverse the givn_string
    for (int i = 0; i < given_string.length(); i++) {
        static int last = ' ';
        if (last == ' ' && given_string[i] != ' '
            && ::isalpha(given_string[i]))
            given_string[i] = ::toupper(given_string[i]);
        last = given_string[i];
    }
    // printing the string
    cout << given_string << endl;
}

Output:

Hello This Is Btechgeeks

Method #2:Using Boost Library

A feature in the Boost Library converts an input sequence to upper case.

template<typename WritableRangeT>
void to_upper(WritableRangeT & Input, const std::locale & Loc = std::locale());

In this case, the input sequence may be a string or a range of iterators, such as boost::iterator_range.
However, we do not want to move the entire string to upper case. We only want a few basic characters translated to upper case. As a result, we’ll make a Range of Filtered Iterator.

Filtered Iterator:

Filtered Iterator is an adaptor iterator that skips certain elements based on a filter, such as a callback attached to it.

Approach:

  • Build a callback that will accept a char and return true if the previous character was whitespace ‘ ‘ and the current char is an alphabet.
  • Build a Start and End Filtered String Iterator that iterates through only the characters that return true when passed to the above filter callback
  • Make a Range out of this filtered iterator’s start and end points.
  • Use this range in conjunction with boost::to_upper to convert only the characters in the filtered iterator to uppercase.

Below is the implementation:

#include <bits/stdc++.h>
#include <boost/algorithm/string.hpp>
#include <boost/iterator/filter_iterator.hpp>
using namespace std;
struct isFirstCharacter {
    // If the previous char was ' ' and the current char is
    // an alphabet, return true.
    bool operator()(char& character)
    {
        static int lastchar = ' ';
        if (lastchar == ' ' && character != ' '
            && ::isalpha(character)) {
            lastchar = character;
            return true;
        }
        lastchar = character;
        return false;
    }
};
int main()
{
    // given string
    string given_string = "hello this is btechgeeks";
    typedef boost::filter_iterator<isFirstCharacter,
                                   string::iterator>
        filter_iterator;
    // Creating a Filter, also known as a Functor Object
    isFirstCharacter isFirstLetterObject;
    // Create the Filtered Iterator's beginning.
    filter_iterator first_filter_itr(isFirstLetterObject,
                                     given_string.begin(),
                                     given_string.end());
    // Create the Filtered Iterator's End
    filter_iterator last_filter_itr(isFirstLetterObject,
                                    given_string.end(),
                                    given_string.end());
    // Create a Range from a filetered iterator's start and
    // end points object
    boost::iterator_range<filter_iterator> stringRange;
    stringRange = boost::make_iterator_range(
        first_filter_itr, last_filter_itr);
    // convert string to upper case
    boost::to_upper(stringRange);
    // print the string
    cout << given_string << endl;
}

Output:

Hello This Is Btechgeeks

Related Programs: