Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


toupper() function?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 Czar05   Members   -  Reputation: 961

Like
0Likes
Like

Posted 04 August 2012 - 11:36 PM

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, 04 August 2012 - 11:37 PM.


Sponsor:

#2 Strewya   Members   -  Reputation: 1487

Like
3Likes
Like

Posted 05 August 2012 - 01:23 AM

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


#3 Mussi   Crossbones+   -  Reputation: 2054

Like
0Likes
Like

Posted 05 August 2012 - 12:01 PM

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]

#4 SamiHuutoniemi   Members   -  Reputation: 259

Like
0Likes
Like

Posted 05 August 2012 - 12:10 PM

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, 05 August 2012 - 12:12 PM.


#5 Mussi   Crossbones+   -  Reputation: 2054

Like
0Likes
Like

Posted 05 August 2012 - 12:38 PM

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 Posted Image.

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, 05 August 2012 - 12:38 PM.


#6 Strewya   Members   -  Reputation: 1487

Like
0Likes
Like

Posted 05 August 2012 - 01:25 PM

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





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS