📅  最后修改于: 2023-12-03 15:07:52.227000             🧑  作者: Mango
C++ 20引入了新的字符串成员函数starts_with()和ends_with(),这些函数非常方便,可以用于在字符串中检查特定的子串是否以给定的前缀或后缀开头或结尾。本文将介绍这两个函数的详细用法,以及一些使用示例。
starts_with()函数用于检查一个字符串是否以给定的前缀开头。它的语法如下:
bool starts_with(const basic_string& str, const basic_string& prefix);
其中,第一个参数是要检查的字符串,第二个参数是要检查的前缀。该函数返回一个布尔值,表示该字符串是否以给定的前缀开头。
让我们看一个使用starts_with()函数的简单例子:
#include <iostream>
#include <string>
int main()
{
std::string str = "Hello, world!";
std::string prefix = "Hello";
if (str.starts_with(prefix))
{
std::cout << "The string starts with the prefix." << std::endl;
}
else
{
std::cout << "The string does not start with the prefix." << std::endl;
}
return 0;
}
输出:
The string starts with the prefix.
ends_with()函数用于检查一个字符串是否以给定的后缀结尾。它的语法如下:
bool ends_with(const basic_string& str, const basic_string& suffix);
其中,第一个参数是要检查的字符串,第二个参数是要检查的后缀。该函数返回一个布尔值,表示该字符串是否以给定的后缀结尾。
让我们看一个使用ends_with()函数的简单例子:
#include <iostream>
#include <string>
int main()
{
std::string str = "Hello, world!";
std::string suffix = "world!";
if (str.ends_with(suffix))
{
std::cout << "The string ends with the suffix." << std::endl;
}
else
{
std::cout << "The string does not end with the suffix." << std::endl;
}
return 0;
}
输出:
The string ends with the suffix.
除了使用std::string对象调用starts_with()和ends_with()函数,还可以使用字符数组来检查给定的前缀或后缀。以下是使用字符数组调用starts_with()和ends_with()函数的示例:
#include <iostream>
#include <string>
int main()
{
const char str[] = "Hello, world!";
const char prefix[] = "Hello";
if (std::string_view(str).starts_with(prefix))
{
std::cout << "The string starts with the prefix." << std::endl;
}
else
{
std::cout << "The string does not start with the prefix." << std::endl;
}
const char suffix[] = "world!";
if (std::string_view(str).ends_with(suffix))
{
std::cout << "The string ends with the suffix." << std::endl;
}
else
{
std::cout << "The string does not end with the suffix." << std::endl;
}
return 0;
}
输出:
The string starts with the prefix.
The string ends with the suffix.
上文中的示例中使用的都是窄字符集,如果要检查宽字符集的字符串,则可以从宽字符串对象或宽字符数组中调用starts_with()和ends_with()函数。以下是使用宽字符集调用starts_with()和ends_with()函数的示例:
#include <iostream>
#include <string>
int main()
{
std::wstring str = L"你好,世界!";
std::wstring prefix = L"你好";
if (str.starts_with(prefix))
{
std::wcout << L"The string starts with the prefix." << std::endl;
}
else
{
std::wcout << L"The string does not start with the prefix." << std::endl;
}
std::wstring suffix = L"世界!";
if (str.ends_with(suffix))
{
std::wcout << L"The string ends with the suffix." << std::endl;
}
else
{
std::wcout << L"The string does not end with the suffix." << std::endl;
}
return 0;
}
输出:
The string starts with the prefix.
The string ends with the suffix.
C++20还引入了requires语句,用于在编译时检查某个类型是否满足给定的要求,当调用starts_with()和ends_with()函数时,我们可以使用requires语句来检查参数是否为字符串类型。以下是使用requires语句的示例:
#include <iostream>
#include <string>
#include <concepts>
template<typename T>
concept string_type = requires(T a) {
{ a.data() } -> std::same_as<const char*>;
{ a.size() } -> std::same_as<std::size_t>;
};
template<string_type str_type>
void print_prefix(const str_type& str, const char* prefix)
{
if (std::string_view(str).starts_with(prefix))
{
std::cout << "The string starts with the prefix." << std::endl;
}
else
{
std::cout << "The string does not start with the prefix." << std::endl;
}
}
template<string_type str_type>
void print_suffix(const str_type& str, const char* suffix)
{
if (std::string_view(str).ends_with(suffix))
{
std::cout << "The string ends with the suffix." << std::endl;
}
else
{
std::cout << "The string does not end with the suffix." << std::endl;
}
}
int main()
{
std::string str = "Hello, world!";
const char* prefix = "Hello";
const char* suffix = "world!";
print_prefix(str, prefix);
print_suffix(str, suffix);
return 0;
}
输出:
The string starts with the prefix.
The string ends with the suffix.
在C++ 20中,新增的字符串成员函数starts_with()和ends_with()非常方便,可以用于在字符串中检查特定的子串是否以给定的前缀或后缀开头或结尾。我们可以用字符数组或宽字符串对象调用这些函数,还可以使用requires语句来检查参数是否为字符串类型。在实际的开发中,这些函数可以大大简化检查字符串的代码。