现代的方法是什么?不赞成使用<cstring>这样的 header ,并且某些编码样式禁止使用“类似于C的”函数。我有三种做同一件事的方法。哪一种最适合现代C++?

1. 使用迭代器并包含空终止符

{
    std::string test{"hello, world!"};
    char* output = new char[test.size() + 1];
    std::copy(test.begin(), test.end(),
        output);
    output[test.size() + 1] = '\0';
    std::cout << output;
    delete output;
}

2. 使用包含空终止符的c_str()
{
    std::string test{"hello, world!"};
    char* output = new char[test.size() + 1];
    std::copy(test.c_str(), test.c_str() + std::strlen(test.c_str()),
        output);
    std::cout << output;
    delete output;
}

3. 使用std::strcpy
{
    std::string test{"hello, world!"};
    char* output = new char[test.size() + 1];
    std::strcpy(output, test.c_str());
    std::cout << output;
    delete output;
}

我不想对访问员说“哦,如果您使用strcpy,您必须是C程序员”看起来像个菜鸟。

最佳答案

获取连续缓冲区的C++ 17之前的现代安全方法是std::vector

std::string test{"hello, world!"};
std::vector<char> output(test.c_str(), test.c_str()+test.size()+1);
// use output.data() here...

从C++ 17开始,std::string具有非常量data()重载。
std::string test{"hello, world!"};
char * p = test.data();

09-10 04:48
查看更多