37

I need to convert a string in C++ to full upper case. I've been searching for a while and found one way to do it:

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

using namespace std;

int main()
{
    string input;
    cin >> input;

    transform(input.begin(), input.end(), input.begin(), toupper);

    cout << input;
    return 0;
}

Unfortunately this did not work and I received this error message:

no matching function for call to 'transform(std::basic_string::iterator, std::basic_string::iterator, std::basic_string::iterator,

I've tried other methods that also did not work. This was the closest to working.

So what I'm asking is what I am doing wrong. Maybe my syntax is bad or I need to include something. I am not sure.

I got most of my info here: http://www.cplusplus.com/forum/beginner/75634/ (last two posts)

Arun
  • 19,750
  • 10
  • 51
  • 60
Thomas W.
  • 511
  • 1
  • 5
  • 10
  • Does this answer your question? [Convert a String In C++ To Upper Case](https://stackoverflow.com/questions/735204/convert-a-string-in-c-to-upper-case) – CinCout Mar 22 '22 at 13:02

8 Answers8

51

You need to put a double colon before toupper:

transform(input.begin(), input.end(), input.begin(), ::toupper);

Explanation:

There are two different toupper functions:

  1. toupper in the global namespace (accessed with ::toupper), which comes from C.

  2. toupper in the std namespace (accessed with std::toupper) which has multiple overloads and thus cannot be simply referenced with a name only. You have to explicitly cast it to a specific function signature in order to be referenced, but the code for getting a function pointer looks ugly: static_cast<int (*)(int)>(&std::toupper)

Since you're using namespace std, when writing toupper, 2. hides 1. and is thus chosen, according to name resolution rules.

user3100212
  • 101
  • 1
  • 5
leemes
  • 44,967
  • 21
  • 135
  • 183
  • 3
    @LokiAstari: The point is that you want the global `toupper`, not the `std::` one(s), which highlights the problem with `use namespace std` -- it pollutes the default namespace with lots of symbols you don't want just to get one or two. If you want to import just a few symbols, you should import just those symbols, not the entire `std` namespace. – Chris Dodd May 02 '14 at 15:56
  • @LokiAstari: No -- if you remove the `using namespace std;` then you can use just `toupper` in this code and it will work (no need for the `::`). Of course, you need to add `using std::transform;` (or stick `std::` before transform) and similarly for other symbols in std that are being used. – Chris Dodd May 02 '14 at 17:19
  • 1
    In addition, you may need `#include ` instead of `#include ` to get `toupper` in the global namespace -- but that's independent of everything else. (`` is allowed to put `toupper` in the global namespace, but not required to) – Chris Dodd May 02 '14 at 17:21
  • @leemes How can I do if I want to only first character in string to uppercase? I tried with ::toupper(input[0]) but it didn't work. – Hasan Basri Jun 17 '20 at 11:46
  • @HasanBasri `toupper` returns the modified character instead of updating it in place. That means, you need to assign back the result: `input[0] = toupper(input[0])`. (Here, I didn't put the two colons, which effectively means I want `std::toupper` when `using namespace std`). – leemes Jun 17 '20 at 14:13
8

Boost string algorithms:

#include <boost/algorithm/string.hpp>
#include <string>

std::string str = "Hello World";

boost::to_upper(str);

std::string newstr = boost::to_upper_copy("Hello World");

Convert a String In C++ To Upper Case

Community
  • 1
  • 1
7

Try this small program, straight from C++ reference

#include <iostream>
#include <algorithm> 
#include <string>  
#include <functional>
#include <cctype>

using namespace std;

int main()
{
    string s;
    cin >> s;
    std::transform(s.begin(), s.end(), s.begin(), std::ptr_fun<int, int>(std::toupper));
    cout << s;
    return 0;

}

Live demo

yizzlez
  • 8,757
  • 4
  • 29
  • 44
3

You could do:

string name = "john doe"; //or just get string from user...
for(int i = 0; i < name.size(); i++) {
    name.at(i) = toupper(name.at(i));
}
jordpw
  • 181
  • 2
  • 16
3

Uppercase to Lowercase and viceversa using BitWise operators

1.

string s = "cAPsLock";
for(char &c: s)
  c = c | ' ';        // similar to: c = tolower(c);
cout << s << endl; // output: capslock
string s = "cAPsLock";
for(char &c: s)
  c = c & ~' ';       // similar to: c = toupper(c);
cout << s << endl; // output: CAPSLOCK

PS: for more info check this link

patilkrunal
  • 384
  • 1
  • 4
  • 14
2
#include <iostream>

using namespace std;

//function for converting string to upper
string stringToUpper(string oString){
   for(int i = 0; i < oString.length(); i++){
       oString[i] = toupper(oString[i]);
    }
    return oString;
}

int main()
{
    //use the function to convert string. No additional variables needed.
    cout << stringToUpper("Hello world!") << endl;
    return 0;
}
0

Like leemes said, you can use toupper(int). Like this:

void ToUpper(string &str) {
    for (auto beg = str.begin(); beg != str.end(); ++beg) {
        *beg = toupper(*beg);
    }
}

It'll through in each character from str and convert it to upper. Example:

int main()
{
    string name;
    cout << "Insert a name: ";
    cin >> name;
    ToUpper(name);
    cout << "Name in upper case: " << name << endl;
}
-1

You can also use the function from code below to convert it to Upper-case.

#include<iostream>
#include<cstring>

using namespace std;

//Function for Converting Lower-Case to Upper-Case
void fnConvertUpper(char str[], char* des)
{
    int i;
    char c[1 + 1];
    memset(des, 0, sizeof(des)); //memset the variable before using it.
    for (i = 0; i <= strlen(str); i++) {
        memset(c, 0, sizeof(c));
        if (str[i] >= 97 && str[i] <= 122) {
            c[0] = str[i] - 32;    // here we are storing the converted value into 'c' variable, hence we are memseting it inside the for loop, so before storing a new value we are clearing the old value in 'c'.
        } else {
            c[0] = str[i];
        }
        strncat(des, &c[0], 1);
    }
}

int main()
{
    char str[20];  //Source Variable
    char des[20];  //Destination Variable

    //memset the variables before using it so as to clear any values which it contains,it can also be a junk value.
    memset(str, 0, sizeof(str));  
    memset(des, 0, sizeof(des));

    cout << "Enter the String (Enter First Name) : ";
    cin >> str; //getting the value from the user and storing it into Source variable.

    fnConvertUpper(str, des); //Now passing the source variable(which has Lower-Case value) along with destination variable, once the function is successfully executed the destination variable will contain the value in Upper-Case

    cout << "\nThe String in Uppercase = " << des << "\n"; //now print the destination variable to check the Converted Value.
}
Vishk V
  • 21
  • 2