将stringstream与char *一起使用是否正确?

时间:2018-09-27 06:17:21

标签: c++

我有一个向量的字符串对象:

我需要使用stringstream将其转换为char *并将char *存储在向量中。 是正确的方法吗?

//! strvector contain string objects and newcharvector needs to be populate. 
for(int i =0 ; i < strvector.size(); i++)
{
    std::string &obj = strvector[i];
    std::stringstream ss;
    char* str;
    ss << obj;
    ss >> str;
    newcharvector.push_back(str);
}

3 个答案:

答案 0 :(得分:3)

char*是一个指向包含字符串的存储区的指针。

在您的示例中:此内存/字符串在哪里?
当然,stringstream(不再使用,请使用istringstreamostringstream)在内部存储字符串,您可以从中检索字符串,但是在{{ 1}}对象被删除,内部字符串被删除,并且您的stringstream指针指向空闲/未使用的内存(该内存很可能由char*变量的下一个实例重新使用)。 / p>

要在stringstream中存储char*,则必须浏览动态内存分配的仙境。还没有。

为什么不将vector存储在std::string中?

答案 1 :(得分:1)

不要使用原始指针!

#include <vector>
#include <string>
#include <iostream>
#include <memory>

int main()
{
    std::vector<std::string> strvector{ "foo", "bar", "baz", "qux", "thud" };
    std::vector<std::shared_ptr<char[]>> newcharvector;

    for (auto const &s : strvector) {
        newcharvector.push_back(std::shared_ptr<char[]>(new char[s.length() + 1]));
        std::strcpy(newcharvector.back().get(), s.c_str());
    }

    for (auto const &s : newcharvector)
        std::cout << s << '\n';
}

答案 2 :(得分:0)

  

这样做正确吗?

这是回旋处。最好使用c_str()获取表示为char*的字符串表示形式,然后使用strdup()保留该字符串(如果有必要,因为c_str()返回的指针无效)修改std::string或超出范围后

std::vector<std::string> strvector{ "foo", "bar" };
    std::vector<char*> pointers;
    for (std::string &s : strvector) {
        pointers.push_back(_strdup(s.c_str()));
    }

    for (char* p : pointers) {
        printf("string: %s\n", p);
    }