将字符串*分配给char * c ++ [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将字符串*分配给char * c ++ [关闭]相关的知识,希望对你有一定的参考价值。

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

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

问题是我不知道如何将string*分配给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.

    }
}
答案

虽然std::string协议允许您访问底层内存,例如通过调用成员c_str(),这些指针都是const。如果将其强制转换为非const指针,如果超出控件的函数然后通过这样的指针修改内容,则存在未定义的行为风险。

从C ++ 17开始,data方法允许您访问指向底层数据的非const指针。

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

获得char*指针到我所看到的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.

    }
}

以上是关于将字符串*分配给char * c ++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将'\'分配给char [重复]

C:将strtok令牌分配给char * Segfault

想要使用 if 条件分配 char 值 - C 语言 [关闭]

为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]

char的C风格转换后的不同内存分配[关闭]

将字符串变量分配给unsigned char变量