toupper() function?

Started by
4 comments, last by Strewya 11 years, 8 months ago
I am having difficulty with the toupper() function. I can't use the string class with this particular function.


#include <iostream>
#include <cctype>
#include <string>

using namespace std;


void inputnshow(string & a);

int main()
{
string sent;

cout << "The following program will convert a sentence and convert it to uppercase.\n";
cout << " " << endl;
inputnshow(sent);


return 0;
}

void inputnshow(string & a)
{
int n = 0;

while(n < 1)
{
cout << " " << endl;
cout << "Enter a string (q to quit).\n";
getline(cin, a);
toupper(a);
cout << a << endl;

cout << " " << endl;

cout << a << endl;
cout << "Next string (q to quit).\n";
getline(cin, a);
toupper(a);
cout << a << endl;

if(a == "q")
{
cout << "Bye" << endl;
system("Pause");
}

}

}




I keep getting an error with the, string a, variable. I tried using a char array, but that requires an initialization and I am looking for user input.
Advertisement
http://www.cplusplus...cctype/toupper/
toupper only works on a single char.
do something like this:

std::string uppercase(const std::string& s)
{
std::string ret;
ret.resize(s.length());
std::transform(s.begin(), s.end(), ret.begin(), toupper);
return ret;
}

devstropo.blogspot.com - Random stuff about my gamedev hobby

If you're going to make a copy you can just take the argument as a copy, looks cleaner IMO:

[source lang="cpp"]std::string uppercase(std::string s)
{
std::transform(s.begin(), s.end(), s.begin(), toupper);
return s;
}[/source]

If you're going to make a copy you can just take the argument as a copy, looks cleaner IMO:

[source lang="cpp"]std::string uppercase(std::string s)
{
std::transform(s.begin(), s.end(), s.begin(), toupper);
return s;
}[/source]


Yes, it looks cleaner, but you get to pass by value twice, which is worse that once. A reference is much less to pass than a whole string. Even better would be to use references or pointers to both source and destination strings, or to just modify the original string directly.

Yes, it looks cleaner, but you get to pass by value twice, which is worse that once. A reference is much less to pass than a whole string. Even better would be to use references or pointers to both source and destination strings, or to just modify the original string directly.


The move semantics in the current standard allows you to avoid unnecessary copies when working with temporary copies. That still doesn't make the code I posted as efficient as yours, since the contents of s are first copied and then overwritten(not sure if true, but I think so), but I personally prefer shorter/cleaner functions when performance doesn't matter much smile.png.

So with regards to your second statement, with the current standard you don't have to use a destination reference for maximum performance per se.
it all depends actually on what you're trying to achieve with your function. in theory, you could have several different functions that do the same thing, with the only difference being how you get the source string, and how you get the destination string.

you could directly modify the source string passed as a reference.
you could pass the destionation string in as a reference.
you could create the destination string in the func and return it.
you could pass the source string as value, modify it then return it.
etc

it think it's mostly a choice of how you're gonna use the function that influences the semantics of it.

devstropo.blogspot.com - Random stuff about my gamedev hobby

This topic is closed to new replies.

Advertisement