• 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

    • NTLite 2025.06.10459 is out.
    • Wireshark 4.4.7 by Razvan Serea  Wireshark is a network packet analyzer. A network packet analyzer will try to capture network packets and tries to display that packet data as detailed as possible. You could think of a network packet analyzer as a measuring device used to examine what's going on inside a network cable, just like a voltmeter is used by an electrician to examine what's going on inside an electric cable (but at a higher level, of course). In the past, such tools were either very expensive, proprietary, or both. However, with the advent of Wireshark, all that has changed. Wireshark is perhaps one of the best open source packet analyzers available today. Deep inspection of hundreds of protocols, with more being added all the time Live capture and offline analysis Standard three-pane packet browser Multi-platform: Runs on Windows, Linux, OS X, Solaris, FreeBSD, NetBSD, and many others Captured network data can be browsed via a GUI, or via the TTY-mode TShark utility The most powerful display filters in the industry Rich VoIP analysis Read/write many different capture file formats Capture files compressed with gzip can be decompressed on the fly Live data can be read from Ethernet, IEEE 802.11, PPP/HDLC, ATM, Bluetooth, USB, Token Ring, Frame Relay, FDDI, and others (depending on your platfrom) Decryption support for many protocols, including IPsec, ISAKMP, Kerberos, SNMPv3, SSL/TLS, WEP, and WPA/WPA2 Coloring rules can be applied to the packet list for quick, intuitive analysis Output can be exported to XML, PostScript®, CSV, or plain text Wireshark 4.4.7 changelog: The following vulnerabilities have been fixed wnpa-sec-2025-02 Dissection engine crash. Issue 20509. CVE-2025-5601. The following bugs have been fixed Wireshark does not correctly decode LIN "go to sleep" in TECMP and CMP. Issue 20463. Dissector bug, Protocol CIGI. Issue 20496. Green power packets are not dissected when proto_version == ZBEE_VERSION_GREEN_POWER. Issue 20497. Packet diagrams misalign or drop bitfields. Issue 20507. Corruption when setting heuristic dissector table UI name from Lua. Issue 20523. LDAP dissector incorrectly displays filters with singleton "&" Issue 20527. WebSocket per-message compression extentions: fail to decompress server messages (from the 2nd) due to parameter handling. Issue 20531. The LL_PERIODIC_SYNC_WR_IND packet is not properly dissected (packet-btle.c) Issue 20554. Updated Protocol Support AT, BT LE LL, CIGI, genl, LDAP, LIN, Logcat Text, net_dm, netfilter, nvme, SSH, TCPCL, TLS, WebSocket, ZigBee, and ZigBee ZCL Download: Wireshark 4.4.7 | 83.2 MB (Open Source) Download: Portable Wireshark 4.4.7 | ARM64 Installer View: Wireshark Website | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Snapchat finally has a watchOS app, a decade after the Apple Watch launched by David Uzondu Snap has announced that Snapchat is finally hopping onto Apple Watch, something many users have probably been waiting for. This new app lets you easily preview an incoming message right on your wrist and then fire back a reply without ever needing to grab your iPhone. For those quick responses, you have options: you can tap out a message on the keyboard, use Scribble to draw letters, dictate your reply, or just send a fitting emoji. Snap says it's trying to make Snapchat easier to use on all the different devices people have in their lives. It's already seen people using Snapchat on tablets and the web, so bringing it to wearables like the Apple Watch feels like the next natural move. That marks a big change from back in 2015 when the Apple Watch first launched. At the time, Snap took a more cautious "wait and see" approach, wanting to see if people actually used smartwatches before building an app. New app launches are not always perfect. It is still early days for the watchOS app, as some users on Reddit have reported the app being stuck on the loading screen. Hopefully, Snap will address these initial teething problems quickly. This expansion to Apple Watch comes after the company abandoned its widely criticized three-tab app redesign following a notable drop in its North American daily active users and significant negative feedback. That redesign, introduced back in September 2024, was meant to simplify things but ended up frustrating many, leading Snap to reverse course after about seven months and work on a refined five-tab layout. Meanwhile, Android smartwatch users with Wear OS are still in a different boat, as there is no official, dedicated Snapchat app for that platform yet. They can typically only receive notifications, and attempts to sideload the full Android app often result in a clunky experience.
    • I've asked Sayan to limit these articles to science tech news.
    • LeafView 3.6.4 by Razvan Serea LeafView is a fast, open-source image viewer built with Electron. It offers a sleek, minimal UI for fast and efficient image browsing. Supporting various formats, LeafView ensures a smooth viewing experience with essential features like zoom, rotation, and slideshow mode. Designed for simplicity and performance, it utilizes hardware acceleration for smooth rendering and supports touch gestures for seamless navigation. LeafView key features: Lightweight & Open-Source – Minimal resource usage with a clean, efficient design Electron-Based – Cross-platform compatibility with modern UI Multiple Image Format Support – Opens JPG, PNG, GIF, BMP, and more Smooth Rendering – Hardware acceleration for fast performance Essential Image Controls – Zoom, rotate, and slideshow mode Touch Gesture Support – Seamless navigation on compatible devices Minimal UI – Focused on simplicity and ease of use LeafView 3.6.4 changelog: Update electron to v36.4.0 Download: LeafView 3.6.4 | Portable | ~100.0 MB (Open Source) View: LeafView Website | Other operating systems | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
  • Recent Achievements

    • One Year In
      survivor303 earned a badge
      One Year In
    • Week One Done
      jbatch earned a badge
      Week One Done
    • First Post
      Yianis earned a badge
      First Post
    • Rookie
      GTRoberts went up a rank
      Rookie
    • First Post
      James courage Tabla earned a badge
      First Post
  • Popular Contributors

    1. 1
      +primortal
      419
    2. 2
      +FloatingFatMan
      182
    3. 3
      snowy owl
      181
    4. 4
      ATLien_0
      174
    5. 5
      Xenon
      137
  • Tell a friend

    Love Neowin? Tell a friend!