2017-02-28 71 views
-2

我有这样的函数:如何使用stringstream将字符串转换为char *?

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,双,字符,字符*)?

嘿,我不知道该怎么解释我的使用情况,但我会努力:

要简单,问题是,给定一个文件,每行,数据可能有这几种:

  • INT
  • 浮子
  • 字符*
  • 阵列T [NUM](T是整数,浮点,字符或字符*,或任何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 ...

+0

您正在解除引用未初始化的指针 – Tas

+0

我不认为您会找到类似['std :: stod']的函数(http://en.cppreference.com/w/cpp/string/basic_string/stof )和['std :: stoi'](http://en.cppreference.com/w/cpp/string/basic_string/stol)系列更吸引人?在我看来,你正试图在这里重新发明轮子。 – WhozCraig

+0

@Tas对不起。我只是忘了键入它的问题。 –

回答

2

此段错误是因为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

请注意固定长度数组:如果输入较大,则会溢出,或者可能存在安全问题。即使输入的规格说明了最大长度,最后也是如此,但它总是可以被妥协。 – cbuchart

+2

不需要'new'。将缓冲区分配为临时值,并让编译器处理它。 – user4581301

+0

伟大的点cbuchart。我编辑了我的答案以反映这一点。 – JeremiahB

1

首先,你的目标变量str_val没有分配的内存,所以这是正常的,你有一个分段错误。

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

相关问题