• Advertisement
Sign in to follow this  

toupper() function?

This topic is 2086 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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. 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
Sign in to follow this  

  • Advertisement