在c ++中获取字符串的所有后缀

时间:2013-07-17 20:04:02

标签: c++ c string

在C中,可以声明一个char数组,创建一个指向数组中特定位置的指针,并取消引用它以获得指定位置的后缀:

char str[6] = "SLEEP";
char* pointer = &(str[1]);
printf("%s\n", pointer);

上面的代码将打印

LEEP

这是位置1中“SLEEP”的后缀。现在有一种方法可以在不使用substr方法的情况下在C ++中执行类似的操作,因为它会生成一个全新的字符串,我试图避免这种情况。

4 个答案:

答案 0 :(得分:8)

你可以完成你已经完成的工作。

char str[6] = "SLEEP";
char* pointer = &(str[1]);
printf("%s\n", 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()需要将const指针返回到C风格的字符串。如果你想要一个在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 ('\0'); // Appended NUL terminator
const char* pointer = &str [1];

但现在我们正在谈论制作副本,显然。

答案 1 :(得分:3)

#include <string>
#include <iostream>

int main()
{
  std::string s("SLEEP");
  std::cout << &s[1] << std::endl;
}

这保证可以在C ++ 11中使用。在C ++ 03中,不存在这样的保证,因为允许实现在写(COW)上使用 copy。但我不记得使用这种方法不起作用。如果您使用C ++ 03并需要保证,则可以使用std::string::c_str()

std::cout << &s.c_str()[1] << std::endl;

答案 2 :(得分:0)

如果需要,可以使用数组方法。 我给出的例子是C ++。

例如MyStr [0]是指向第一个元素的指针。

#include <string>
#include <iostream>
int main()
{
    std::string MyStr="abc";
    std::cout<<&MyStr[1];
}

输出:bc

希望有所帮助: - )

答案 3 :(得分:0)

您可以使用字符串引用类。字符串引用类提供类似字符串的功能,但实际上并不拥有底层存储。

以下是使用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”的实际实例。 sr1sr2str的字符串引用。