我有这样的功能:
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分配内存......
答案 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
。如果你必须修改它,那么只需创建一个副本。