#include <algorithm>
#include <string>
#include <iostream>
#include <cctype>
#include <functional>
using namespace std;
// A function object that will take a character, and append either "%20" or the
// original character to our new string
struct Converter
{
std::string* pS; // this points to our string we will build
Converter(std::string* s) : pS(s) {}
void operator()(char ch)
{
if ( isspace(ch) )
(*pS) += "%20"; // it's a space, so replace
else
*pS += ch; // it is not a space, so use the same character
}
};
// trim spaces from end of string
std::string &rtrim(std::string &s)
{
s.erase(std::find_if(s.rbegin(), s.rend(),
std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
return s;
}
// function to return the new string by looping over the original string
string getNewString(const std::string& s)
{
std::string outStr; // our new string
// loop over each character, calling our Coverter::operator()(char) function
for_each(s.begin(), s.end(), Converter(&outStr));
return outStr;
}
int main()
{
string instring = "This string has spaces ";
cout << getNewString(rtrim(instring));
}
ICAgICNpbmNsdWRlIDxhbGdvcml0aG0+CiAgICAjaW5jbHVkZSA8c3RyaW5nPgogICAgI2luY2x1ZGUgPGlvc3RyZWFtPgogICAgI2luY2x1ZGUgPGNjdHlwZT4KICAgICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogICAgCiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIC8vIEEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgd2lsbCB0YWtlIGEgY2hhcmFjdGVyLCBhbmQgYXBwZW5kIGVpdGhlciAiJTIwIiBvciB0aGUgCiAgICAvLyBvcmlnaW5hbCBjaGFyYWN0ZXIgdG8gb3VyIG5ldyBzdHJpbmcgICAgCiAgICBzdHJ1Y3QgQ29udmVydGVyCiAgICB7CiAgICAJc3RkOjpzdHJpbmcqIHBTOyAgLy8gdGhpcyBwb2ludHMgdG8gb3VyIHN0cmluZyB3ZSB3aWxsIGJ1aWxkCiAgICAKICAgIAlDb252ZXJ0ZXIoc3RkOjpzdHJpbmcqIHMpIDogcFMocykge30KICAgIAogICAgCXZvaWQgb3BlcmF0b3IoKShjaGFyIGNoKSAKICAgIAl7CiAgICAJCWlmICggaXNzcGFjZShjaCkgKQogICAgCQkJKCpwUykgKz0gIiUyMCI7ICAgLy8gaXQncyBhIHNwYWNlLCBzbyByZXBsYWNlCiAgICAJCWVsc2UKICAgIAkJCSpwUyArPSBjaDsgICAgLy8gaXQgaXMgbm90IGEgc3BhY2UsIHNvIHVzZSB0aGUgc2FtZSBjaGFyYWN0ZXIKICAgIAl9CiAgICB9OwogICAgCiAgICAvLyB0cmltIHNwYWNlcyBmcm9tIGVuZCBvZiBzdHJpbmcKICAgIHN0ZDo6c3RyaW5nICZydHJpbShzdGQ6OnN0cmluZyAmcykgCiAgICB7CiAgICAJcy5lcmFzZShzdGQ6OmZpbmRfaWYocy5yYmVnaW4oKSwgcy5yZW5kKCksIAogICAgICAgICAgICAgICAgc3RkOjpub3QxKHN0ZDo6cHRyX2Z1bjxpbnQsIGludD4oc3RkOjppc3NwYWNlKSkpLmJhc2UoKSwgcy5lbmQoKSk7CiAgICAJcmV0dXJuIHM7CiAgICB9CgogICAgLy8gZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBuZXcgc3RyaW5nIGJ5IGxvb3Bpbmcgb3ZlciB0aGUgb3JpZ2luYWwgc3RyaW5nIAogICAgc3RyaW5nIGdldE5ld1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykKICAgIHsKICAgIAlzdGQ6OnN0cmluZyBvdXRTdHI7ICAvLyBvdXIgbmV3IHN0cmluZwoKICAgICAgICAvLyBsb29wIG92ZXIgZWFjaCBjaGFyYWN0ZXIsIGNhbGxpbmcgb3VyIENvdmVydGVyOjpvcGVyYXRvcigpKGNoYXIpIGZ1bmN0aW9uCiAgICAJZm9yX2VhY2gocy5iZWdpbigpLCBzLmVuZCgpLCBDb252ZXJ0ZXIoJm91dFN0cikpOwogICAgCXJldHVybiBvdXRTdHI7CiAgICB9CiAgICAKICAgIGludCBtYWluKCkKICAgIHsKICAgIAlzdHJpbmcgaW5zdHJpbmcgPSAiVGhpcyBzdHJpbmcgaGFzIHNwYWNlcyAiOwogICAgICAgIGNvdXQgPDwgZ2V0TmV3U3RyaW5nKHJ0cmltKGluc3RyaW5nKSk7CiAgICB9Cg==