首页 > 解决方案 > 将 string* 分配给 char* c++

问题描述

我需要在 C++ 中读取一个文件并保存每一行(在一个向量中),因为我稍后会处理它们。

我还需要保存一个 char* 向量,它将指向每个字符串* 的第一个位置。

问题是我不知道如何分配string*to char*

仅供参考,我不能使用const char*,它必须是char*

代码:

void ClassA::readFile() {

    std::ifstream file("test.txt");

    std::string* str = new string();
    while (std::getline(file, *str))
    {

        _aVector.push_back(*str);


        char *c = &str[0]; <-- This works if string is not declared as string*
        char *c = ....     <--What is the equivalent for string*

        str = new string();

        someFunction(c); <-- This function saves the *c in a vector.

    }
}

标签: c++stringcharreadfilec++98

解决方案


尽管该std::string协议允许您访问底层内存,例如通过调用 member c_str(),但这些指针都是const. 如果将其转换为非常量指针,如果超出您控制范围的函数随后通过此类指针修改内容,则您将面临未定义行为的风险。

从 C++17 开始,data-方法使您可以访问指向基础数据的非常量指针。

无论如何,请注意,如果需要,字符串对象将 - 再次超出您的控制 - 替换底层内存,然后您的指针可能会变得无效。所以我想说存储指向字符串对象内容的指针通常不是一个好主意。

char*获得指向我看到的内容的 -pointer的唯一方法std::string是复制字符串的内容,例如使用strdup. 因此,您可以避免意外修改访问的未定义行为,并且您可以将其char*与字符串对象管理的内存分离。

请参阅以下代码说明这一点:

int main() {

    std::vector<std::string> aVector;
    std::ifstream file("test.txt");
    std::string str;
    while (std::getline(file, str))
    {
        aVector.push_back(str);

        char *c = strdup(str.c_str());

        someFunction(c); // <-- This function saves the *c in a vector.

    }
}

推荐阅读