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

时间:2017-02-28 05:22:17

标签: c++ string char 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 *)?

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

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

  • INT
  • 字符*
  • 数组T [num](T为int,float,char或char *,或任何build_in类型。)

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

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

谢谢,我现在发现了错误。

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分配内存......

2 个答案:

答案 0 :(得分:3)

此段错误是因为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()应该有效),但用户必须释放返回的内存

答案 1 :(得分:1)

首先,您的目标变量std::string没有分配内存,因此您有分段错误是正常的。

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