如何检查C ++中的string开始

在C ++中有没有办法检查一个string是否以某个string开始(小于原始string)? 就像我们可以用Java做的一样

bigString.startswith(smallString); 
 std::string s("Hello world"); if (s.find("Hello") == 0) { std::cout << "String starts with Hello\n"; } 

你可以用string::compare()来做到这一点,它提供了比较两个string的全部或部分的各种选项。 此版本将smallStringbigString的适当大小前缀进行比较(如果bigStringsmallString短,则工作正常):

 bigString.compare(0, smallString.length(), smallString) 

我倾向于把它包装在一个名为startsWith()的自由函数中,否则它看起来有点神秘。

使用string::find()或者string::substr()方法不是最优的,因为它们要么复制你的string,要么在string的开头search多个匹配项。 这可能不是一个问题,但如果是你可以使用std::equalalgorithm。 请记住检查“干草堆”是否至less与“针”一样长。

 #include <string> using namespace std; bool startsWith(const string& haystack, const string& needle) { return needle.length() <= haystack.length() && equal(needle.begin(), needle.end(), haystack.begin()); } 

一如既往,正确的解决scheme来自Boost: boost::algorithm::starts_with

优化一点:

 if ( smallString.size() <= bigString.size() && strncmp( smallString.c_str(), bigString.c_str(), smallString.length() ) == 0 ) dont forget to #include <cstring> // or <string.h> 

最简单的方法是:

 if ( smallString.size() <= bigString.size() && std::equals( smallString.begin(), smallString.end(), bigString.end() ) 

(如果两者中的一个或者两个都是向量,或者其他标准的容器types,这也是可行的。)

strstr()返回一个指向string中第一个string的指针。

我认为这是有道理的发布一个原始的解决scheme,不使用任何库函数…

 // Checks whether `str' starts with `start' bool startsWith(const std::string& str, const std::string& start) { if (&start == &str) return true; // str and start are the same string if (start.length() > str.length()) return false; for (size_t i = 0; i < start.length(); ++i) { if (start[i] != str[i]) return false; } return true; } 

添加一个简单的std::tolower可以使这个case不敏感

 // Checks whether `str' starts with `start' ignoring case bool startsWithIgnoreCase(const std::string& str, const std::string& start) { if (&start == &str) return true; // str and start are the same string if (start.length() > str.length()) return false; for (size_t i = 0; i < start.length(); ++i) { if (std::tolower(start[i]) != std::tolower(str[i])) return false; } return true; } 

我很惊讶没有人发布这种方法呢:

 #include <string> using namespace std; bool starts_with(const string& smaller_string, const string& bigger_string) { return (smaller_string == bigger_string.substr(0,smaller_string.length())); } 

创build一个子string,它是你的smallStringvariables的长度,然后比较这两个string。 或者search子stringsmallString并查看它是否返回索引0

http://www.cplusplus.com/reference/string/string/substr/

你可以使用string.substr()来查看任意位置的任意数量的字符,或者你可以使用一个string.find()成员。