• 0

How to compare 1 string against multiple strings?


Question

Ok, I am a beginner at c++ and I cannot figure out the best way to compare a string to multiple strings....

Basically I want something to do this:

1. User enters name such as John Doe, but I want it to not matter if they type it in uppercase, lowercase, etc.

2. Name is checked against multiple strings such as...(john doe) (John Doe) (JOHN DOE)

3. if the name the user enters matches one of those the result is 0, or something similar.

What is the best way to do this? Is there a way that I could just type one string to compare it to the name the user enters instead of every possibility? So I need a way to compare it disregarding the uppercase, lowercase....I think.

Thanks for any help!

Also, I can never think of any programs to make for practice, is there a website with some ideas?

17 answers to this question

Recommended Posts

  • 0
  PricklyPoo said:
Ok, I am a beginner at c++ and I cannot figure out the best way to compare a string to multiple strings....

Basically I want something to do this:

1. User enters name such as John Doe, but I want it to not matter if they type it in uppercase, lowercase, etc.

2. Name is checked against multiple strings such as...(john doe) (John Doe) (JOHN DOE)

3. if the name the user enters matches one of those the result is 0, or something similar.

What is the best way to do this? Is there a way that I could just type one string to compare it to the name the user enters instead of every possibility? So I need a way to compare it disregarding the uppercase, lowercase....I think.

Thanks for any help!

Also, I can never think of any programs to make for practice, is there a website with some ideas?

Take the string and change it to all upper or all lower then compare once.

  • 0
  PricklyPoo said:
But what happens if the user enters JoHn dOE....

You take the string "JoHn dOE" convert to all upper = "JOHN DOE" then comare. If all you want to do is verify that john doe was typed regardless of case then change the case of the string and compare to match. If you have to compare against a certain case (John Doe is different then john doe) then you need multiple compares.

  • 0

It doesn't matter. It changes the entire string to upper case. If you do that, like a8ball said, you can just compare 1 time instead of doing it multiple times.

  • 0
  a8ball said:
You take the string "JoHn dOE" convert to all upper = "JOHN DOE" then comare. If all you want to do is verify that john doe was typed regardless of case then change the case of the string and compare to match. If you have to compare against a certain case (John Doe is different then john doe) then you need multiple compares.
  IceBreakerG said:
It doesn't matter. It changes the entire string to upper case. If you do that, like a8ball said, you can just compare 1 time instead of doing it multiple times.

Oh, I see now, thanks!

  • 0

I just tried to make a quick program but I must be doing a lot wrong since I am getting errors, please help! :p

#include<iostream>
#include <cctype>
#include<string>
using namespace std;

int main()
{

	char johndoe[] = "john doe";
	char name[50];

	cout << "Please Enter Your First And Last Name.\n" << endl;

	cin.getline(name, 50, '\n');

	name=tolower(name);

   if (strcmp(johndoe, name) = 0 ){

	cout << "You Are John Doe.\n";
	}
	else {
		 cout << "You Are Not John Doe.";
		 }
	return 0;
}

  • 0

Hi Prickly,

Some problems, tolower seems to expect one character, and it returns an int.

http://www.cplusplus.com/reference/clibrar...pe/tolower.html

So you need to loop through each character in your name (you know the number of times you have to loop by checking the length of your string), and convert them one by one.

  • 0

Thanks for the help!

I am just really having a hard time understanding this. :(

I tried to just use the code on that cplusplus website and replace it with my variables but it didn't work. :/

#include<iostream>
#include <cctype>
#include<string>
using namespace std;

int main()
{
	int i=0;
	char johndoe[] = "john doe";
	char name[50];

	cout << "Please Enter Your First And Last Name.\n" << endl;

	cin.getline(name, 50, '\n');

	while (johndoe[i])
	{
		  name=johndoe[i];
		  putchar (tolower(name));
		  i++;
		  }


   if (strcmp(johndoe, name) = 0 ){

	cout << "You Are John Doe.\n";
	}
	else {
		 cout << "You Are Not John Doe.";
		 }
	return 0;
}

It just comes up with the char to int problem and incompatible types in assignment of `char' to `char[50] messages.

So I need to just do them one by one and keep looping? Isn't there a better way? What if I wanted to compare multiple strings, I would have to do a loop for each one then?

  • 0

You can also make it a bit more complex and make use of the <algorithm> header:

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;cctype&gt;

int main ()
{
	std::string x = "John Doe";

	// transform(iterator start, iterator finish, iterator initialResultPosition, UnaryFunction op);
	// initialResultPosition - where to start storing the result for each iteration
	// (it is automatically incremented each iteration)
	// op - a pointer to a function
	std::transform(x.begin(), x.end(), x.begin(), toupper);
	std::cout &lt;&lt; x &lt;&lt; std::endl;
}

If you need more info, feel free to check out cplusplus.com's entry on the transform algorithm or cppreference.com's entry on the transform algorithm (or both). Note that cppreference keeps things simple. cplusplus.com prefers to give examples, and specify a LOT more on the page, which can make it difficult to figure out what you need to read.

Edit:

If you want to still do it without the algorithm, here it is:

for (int i = 0; i &lt; someString.length(); i++)
	someString[i] = toupper(someString[i]);

Edited by rpgfan
  • 0

Thanks rpg, I used the second code you posted and it works.

#include&lt;iostream&gt;
#include &lt;cctype&gt;
#include&lt;string&gt;
#include &lt;algorithm&gt;
using namespace std;

int main()
{

	string x = "john doe";
	string y;

	cout &lt;&lt; "Please Enter Your First And Last Name.\n" &lt;&lt; endl;

	getline(cin, y, '\n');

   for (int i = 0; i &lt; y.length(); i++)
	y[i] = tolower(y[i]);

   if (strcmp (x,y) == 0);
   {
			  cout &lt;&lt; "You Are John Doe.";

   cin.get();
}

The only problem is strcmp, it says I need two const chars, does that mean I have to save the results of the tolower function to chars somehow and then run strcmp?

  • 0

You shouldn't need to use strcmp. You can just use the '==' operator when you use C++ strings. :)

However, if you really needed to use strcmp, you would use strcmp(x.c_str(), y.c_str()). The c_str member function returns a C-string, a null-terminated array of chars.

  • 0
  rpgfan said:
You shouldn't need to use strcmp. You can just use the '==' operator when you use C++ strings. :)

However, if you really needed to use strcmp, you would use strcmp(x.c_str(), y.c_str()). The c_str member function returns a C-string, a null-terminated array of chars.

Hehe oh, ok.

Works perfectly now thanks!

#include&lt;iostream&gt;

using namespace std;

int main()
{

	string x = "john doe";
	string y;

	cout &lt;&lt; "Please Enter Your First And Last Name.\n" &lt;&lt; endl;

	getline(cin, y, '\n');

   for (int i = 0; i &lt; y.length(); i++)
	y[i] = tolower(y[i]);

   if ( x == y )
   {
			  cout &lt;&lt; "You Are John Doe.";
			  }
   else 
   {
		cout &lt;&lt; "You Are Not John Doe.";
		}

   cin.get();
}

Here it is if anyone other beginner ever needs it as a reference. :p

  • 0

Oh, and I should note that the loop should actually use an unsigned integer, not a signed integer, which is the default if no signed/unsigned specifier is...specified.

The reason for this is because the length member function returns a size. Obviously, you can have a zero-length (empty) string, but you can't go any lower than 0, which is why it should be unsigned. In fact, gcc complains about comparing a signed value (the loop variable) with an unsigned value (x.length()).

Happy coding! :)

  • 0

Quickly threw this together. Untested - but should work.

#include &lt;iostream&gt;
#include &lt;string&gt;

int main()
{
	std::string name;
	std::string nameCompare = "John Doe";

	std::cout &lt;&lt; "Enter name: ";
	getline(std::cin, name);

	if (name.compare(nameCompare) == 0)
	{
		std::cout &lt;&lt; "identical" &lt;&lt; std::endl;
	}
	else
	{
		std::cout &lt;&lt; "not identical" &lt;&lt; std::endl;
	}
}

EDIT: Nevermind, didn't see that you wanted to check for varying cases.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Microsoft Project 2021 Professional for Windows now just $9.97 by Steven Parker Today's highlighted deal comes from our Apps & Software section of the Neowin Deals store, where you can save $240 off Microsoft Project 2021 Professional for Windows. Be the boss of any project with Microsoft Project Professional 2021. This powerful yet easy-to-use app lets you stay on track, from small tasks to larger projects. Manage your projects more efficiently with the right timelines, budgets, and resources. You'll get automated scheduling tools as well as built-in reports to help you reduce inefficiencies and make better, informed decisions. Project management has never been this easy with Microsoft Project Pro. Lifetime license for Microsoft Project Professional 2021 One-time purchase installed on 1 Windows PC for use at home or work Instant Delivery & Download – access your software license keys and download links instantly Free customer service – only the best support! Why Microsoft Project Professional 2021? Pre-built templates help you get your project started on the right track Sync with Project Online and Project Server Submit timesheets to capture time spent on project and non-project work Run what-if scenarios to make the most of your task assignments Auto-populate start and end dates based on dependencies Visually represent complex schedules with built-in multiple timelines Supports Long-Term Servicing Channel (LTSC) and is compatible with Office LTSC and Office 2021 Good to know Length of access: lifetime Redemption deadline: redeem your code within 30 days of purchase Access options: desktop Max number of device(s): 1 Version: 2021 Pro Updates included Microsoft Project 2021 Professional for Windows normally costs $249.99, but it can be yours for just $14.97 for a limited time, that's a saving of $235. For terms, specifications, and license info please click the link below. Use MSO5 when checking out for additional $5 off. Coupon Expires June 29 Get Microsoft Project 2021 Professional for Windows for just $9.97, or learn more Although priced in U.S. dollars, this deal is available for digital purchase worldwide. We post these because we earn commission on each sale so as not to rely solely on advertising, which many of our readers block. It all helps toward paying staff reporters, servers and hosting costs. Other ways to support Neowin Whitelist Neowin by not blocking our ads Create a free member account to see fewer ads Make a donation to support our day to day running costs Subscribe to Neowin - for $14 a year, or $28 a year for an ad-free experience Disclosure: Neowin benefits from revenue of each sale made through our branded deals site powered by StackCommerce.
    • Weird how some people don't need to crash 7 rockets before they get it right.
    • Or it's a bug that can easily be fixed with an update. My guess is the limitation is there to prevent game makers from doing dumb things like having a racing game constantly rumble while the car is in motion. Sounds like the threshold or detection needs to be tweaked if it is triggering for no reason.
    • Nice I guess. Azure's DaaS feature has supported that for years. It's so odd to me how MS is deploying Azure and 365 DaaS as two totally different services with different features. I would think the 365 cloud desktops would just be a slightly dumbed down frontend that manages the same service.
    • Oh and gaming on a PC cost way more. To get PS5 Pro performance on a PC it will cost you more, especially with the crazy GPU costs today. While you can play Last of US and Horizon, finally, you cant play GT7 unless you have a PS5 (other games as well).
  • Recent Achievements

    • Week One Done
      slackerzz earned a badge
      Week One Done
    • Week One Done
      vivetool earned a badge
      Week One Done
    • Reacting Well
      pnajbar earned a badge
      Reacting Well
    • Week One Done
      TBithoney earned a badge
      Week One Done
    • First Post
      xuxlix earned a badge
      First Post
  • Popular Contributors

    1. 1
      +primortal
      669
    2. 2
      ATLien_0
      284
    3. 3
      Michael Scrip
      223
    4. 4
      +FloatingFatMan
      196
    5. 5
      Steven P.
      137
  • Tell a friend

    Love Neowin? Tell a friend!