在 c++ 中获取字符串的所有后缀
Getting all suffixes of a string in c++
在C中,可以声明一个char数组,创建一个指向数组中特定位置的指针,并取消引用它以获取指定位置的后缀:
char str[6] = "SLEEP";
char* pointer = &(str[1]);
printf("%sn", pointer);
上面的代码将打印
LEEP
这是位置 1 中"SLEEP"的后缀。现在有没有办法在不使用 substr 方法的情况下在C++中做类似的事情,因为它会产生一个全新的字符串,我试图避免这种情况。
你可以完全做你已经做过的事情。
char str[6] = "SLEEP";
char* pointer = &(str[1]);
printf("%sn", pointer);
如果您使用的是std::string
而不是原始char
缓冲区(您应该这样做(,则在 C++11 std::string
下保证具有连续存储 (21.4.1/5( 并附加 NUL 终止符 (21.4.7.1/1(:
std::string str = "SLEEP";
const char* pointer = &str[1];
这些保证是C++11的新保证 - C++03没有这样的保证。 但是,我知道的所有实现实际上都使用带有附加 NUL 终止符的连续存储。 他们这样做是因为需要c_str()
返回指向 C 样式字符串的const
指针。 如果您想要一个保证符合 C++03 的解决方案,那么即使在 C++03 中,std::vector
也会做出相同的连续性保证,但当然,您必须自行应用 NUL 终止符:
std::string load = "SLEEP";
vector <char> str;
copy (load.begin(), load.end(), back_inserter (str));
load.push_back (' '); // Appended NUL terminator
const char* pointer = &str [1];
但现在我们谈论的是制作副本,显然。
#include <string>
#include <iostream>
int main()
{
std::string s("SLEEP");
std::cout << &s[1] << std::endl;
}
这保证在 C++11 中有效。在 C++03 中,不存在这样的保证,因为允许实现使用写入时复制 (COW(。但我不记得使用过不起作用的实现。如果您使用 C++03 并需要保证,您可以使用std::string::c_str()
:
std::cout << &s.c_str()[1] << std::endl;
如果需要,可以使用数组方法。我举的例子是C++。
例如,MyStr[0] 是指向第一个元素的指针。
#include <string>
#include <iostream>
int main()
{
std::string MyStr="abc";
std::cout<<&MyStr[1];
}
输出:公元前
希望有帮助:-(
可以使用字符串引用类。字符串引用类提供类似字符串的功能,但实际上并不拥有基础存储。
下面是使用 Boost string_ref
类的示例(可在 Boost.Utility 中找到(
#include <iostream>
#include <string>
#include <boost/utility/string_ref.hpp>
int main(int argc, const char * argv[])
{
using namespace std;
string str = "SLEEP";
cout << "str: " << str << endl;
boost::string_ref sr1(str);
cout << "sr1: " << sr1 << endl;
boost::string_ref sr2 = sr1.substr(1);
cout << "sr2: " << sr2 << endl;
return 0;
}
注意:字符串"SLEEP"只有一个实际实例。 sr1
和 sr2
是对 str
的字符串引用。