如何使用 stringstream 将字符串转换为 char*?

How to convert string to char* using stringstream?

我有这样的功能:

template <typename T>
void parse_to_T(const std::string& str, T* result) {
    std::stringstream ss;
    ss << str;
    ss >> *result;
}

该函数是将字符串转换为指定类型

正在将字符串解析为 int、float 或 char。

parse_to_T<int>(...);
parse_to_T<float>(...);
parse_to_T<char>(...);

但是当遇到char*时,段错误...

我是这样使用函数的:

int int_val;
string m = "1";
parse_to_T<int>(m, &int_val); // works
char* str_val = NULL;
parse_to_T<char*>(m, &str_val); // segmentfault

如何隐含这个函数使其工作?

(将字符串转换为指定类型,如 int、double、char、char*)?

嘿,我不知道如何解释我的用例,但我会尝试:

简单来说,问题是,给定一个文件,对于每一行,数据可能有这些类型:

实现一个解析函数来解析这个文件。

而且这个问题是考试...


谢谢,我现在找到错误了。

char* str_val = NULL;
parse_to_T<char*>(m, &str_val); // segmentfault;
char* str_val;
parse_to_T<char*>(m, &str_val); // segmentfault;
char* str_val = new char[256];
parse_to_T<char*>(m, &str_val); // works !!

然后错误是我没有为 ptr 分配内存...

首先,您的目标变量 str_val 没有分配内存,所以出现分段错误是正常的。

另一方面,如果您改用 std::string 会更好。如果你需要原始指针 const char* 那么你可以使用 std::string::c_str 。如果您必须修改它,那么只需创建一个副本即可。

这个段错误是因为 stringstream 在将值提取到 char* 数组时没有分配内存来保存操作结果。它尝试将值放入 lhs 操作数指向的内存中。你必须自己分配内存。

这是一个简单的例子:

#include <string>
#include <sstream>
#include <iostream>

template <typename T>
void parse_to_T(const std::string& str, T* result) {
    std::stringstream ss;
    ss << str;
    std::cout << ss.str() << std::endl;
    ss >> *result;
    std::cout << *result << std::endl;
}

int main() {
   char* buffer = new char[256];
   /* Don't do this in real code. If the input is larger than
      the size of the buffer it will end very, very badly.
      always have a way of allocating the correct amount
      of memory.
   */
   int int_val;
   std::string m = "1";
   parse_to_T<int>(m, &int_val);
   char* str_val = NULL;
   parse_to_T<char*>(m, &buffer);
   delete[] buffer;
   return 0;
}

您可以包含 char* 数据类型的模板专门化,它根据流中的数据量进行分配(调用 stringstream.str().size() 应该有效),但用户必须释放恢复记忆。