0

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

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

上面的代码将打印

LEEP

这是位置 1 中“SLEEP”的后缀。现在有没有办法在 C++ 中做类似的事情而不使用 substr 方法,因为它会产生一个全新的字符串,我正试图避免这种情况。

4

4 回答 4

8

你可以做你已经做过的事情。

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

如果您使用的是 astd::string而不是原始char缓冲区(就像您应该使用的那样),那么在 C++11std::string下保证具有附加的 NUL 终止符(21.4.7.1/1)的连续存储(21.4.1/5):

std::string str = "SLEEP";
const char* pointer = &str[1];

这些保证对于 C++11 来说是新的——C++03 不做这样的保证。然而,我知道的所有实现实际上都使用带有附加 NUL 终止符的连续存储。他们这样做c_str()是因为需要返回const指向 C 样式字符串的指针。如果您想要一个保证在 C++03 中兼容的解决方案,那么std::vector即使在 C++03 中也要做出相同的连续性保证,但当然您必须自己应用 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];

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

于 2013-07-17T20:11:05.493 回答
3
#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;
于 2013-07-17T20:08:16.400 回答
0

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

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

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

输出:公元前

希望有帮助:-)

于 2013-07-17T20:08:13.797 回答
0

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

这是一个使用 Booststring_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.

于 2013-07-17T20:32:13.397 回答