Sign in to follow this  
Carbon101

toupper() function?

Recommended Posts

I am having difficulty with the toupper() function. I can't use the string class with this particular function.

[CODE]
#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");
}

}

}

[/code]


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. Edited by Czar05

Share this post


Link to post
Share on other sites
[url="http://www.cplusplus.com/reference/clibrary/cctype/toupper/"]http://www.cplusplus...cctype/toupper/[/url]
toupper only works on a single char.
do something like this:

[CODE]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;
}[/CODE]

Share this post


Link to post
Share on other sites
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]

Share this post


Link to post
Share on other sites
[quote name='Mussi' timestamp='1344189710' post='4966406']
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]
[/quote]

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. Edited by SamiHuutoniemi

Share this post


Link to post
Share on other sites
[quote name='SamiHuutoniemi' timestamp='1344190246' post='4966409']
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.
[/quote]

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 [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img].

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. Edited by Mussi

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this