如何使用 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*)?
嘿,我不知道如何解释我的用例,但我会尝试:
简单来说,问题是,给定一个文件,对于每一行,数据可能有这些类型:
- 整数
- 浮动
- 字符
- 字符*
- 数组 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 分配内存...
首先,您的目标变量 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()
应该有效),但用户必须释放恢复记忆。
我有这样的功能:
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*)?
嘿,我不知道如何解释我的用例,但我会尝试:
简单来说,问题是,给定一个文件,对于每一行,数据可能有这些类型:
- 整数
- 浮动
- 字符
- 字符*
- 数组 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 分配内存...
首先,您的目标变量 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()
应该有效),但用户必须释放恢复记忆。