std::string comparison (check whether string begins with another string)

C++StringStlCompare

C++ Problem Overview


I need to check whether an std:string begins with "xyz". How do I do it without searching through the whole string or creating temporary strings with substr().

C++ Solutions


Solution 1 - C++

I would use compare method:

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

Solution 2 - C++

An approach that might be more in keeping with the spirit of the Standard Library would be to define your own begins_with algorithm.

#include <algorithm>
using namespace std;


template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
	return input.size() >= match.size()
		&& equal(match.begin(), match.end(), input.begin());
}

This provides a simpler interface to client code and is compatible with most Standard Library containers.

Solution 3 - C++

Look to the Boost's String Algo library, that has a number of useful functions, such as starts_with, istart_with (case insensitive), etc. If you want to use only part of boost libraries in your project, then you can use bcp utility to copy only needed files

Solution 4 - C++

It seems that std::string::starts_with is inside C++20, meanwhile std::string::find can be used

std::string s1("xyzblahblah");
std::string s2("xyz")

if (s1.find(s2) == 0)
{
   // ok, s1 starts with s2
}

Solution 5 - C++

I feel I'm not fully understanding your question. It looks as though it should be trivial:

s[0]=='x' && s[1]=='y' && s[2]=='z'

This only looks at (at most) the first three characters. The generalisation for a string which is unknown at compile time would require you to replace the above with a loop:

// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
  if (s[i]!=t[i])
    return false;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjackhabView Question on Stackoverflow
Solution 1 - C++WacekView Answer on Stackoverflow
Solution 2 - C++NeutrinoView Answer on Stackoverflow
Solution 3 - C++Alex OttView Answer on Stackoverflow
Solution 4 - C++Alejadro XalabarderView Answer on Stackoverflow
Solution 5 - C++1800 INFORMATIONView Answer on Stackoverflow