C++ 使用Stringstream将字符串转换为Int
这里有一个小问题:C++ 使用Stringstream将字符串转换为Int,c++,string,casting,int,transformation,C++,String,Casting,Int,Transformation,这里有一个小问题: int IntegerTransformer::transformFrom(std::string string){ stream->clear(); std::cout<<string<<std::endl;; (*stream)<<string; int i; (*stream)>>i; std::cout<<i<<std::endl; r
int IntegerTransformer::transformFrom(std::string string){
stream->clear();
std::cout<<string<<std::endl;;
(*stream)<<string;
int i;
(*stream)>>i;
std::cout<<i<<std::endl;
return i;
}
您是否注意到函数本身中有两个
std::cout
除此之外,还要添加以下内容:
stream->str(""); //This ensures that the stream is empty before you use it.
(*stream)<<string;
流->清除()
此不会“清空”stringstream的内容。它重置从流读取失败时设置的错误标志(例如,因为文本的格式不适合读取整数)
处理此问题的最简单方法是创建一个新的本地范围的stringstream:
int IntegerTransformer::transformFrom(std::string string){
std::stringstream parser(string);
int i;
parser>>i;
return i;
}
请注意,您不再需要处理指针(我假设是动态分配),您可以使用构造函数来设置初始值
一般来说,将流作为类的数据成员是个坏主意。它们真的不适合那种用途
下一个最简单的解决方案是使用实际用于作业的成员函数,.str()
,如Nawaz所示
正如纳瓦兹所提到的,不管怎样,放弃整个过程,仅仅使用
boost::lexical_cast
可能是一个更好的主意。不要重新发明轮子。ty非常,似乎我误解了stream->clear()的用法;替换为stream->str(“”);works fien now:)可能希望简化流引用;使用类似于istream&theStream=*stream代码>,然后您可以使用流,而不必每次对其进行解除锁定。本地作用域的流不会在每次调用函数时分配缓冲区吗?我担心会对性能造成不必要的影响。他们会的。如果您真的关心性能,那么首先就不必将字符串转换为int。除非您必须这样做,例如字符串来自用户输入;但在这种情况下,程序实际读取字符串所需的时间比执行此操作所需的时间要长得多,而且延迟是不可避免的,因此。。。
int IntegerTransformer::transformFrom(std::string s){
return boost::lexical_cast<int>(s);
}
int IntegerTransformer::transformFrom(std::string string){
std::stringstream parser(string);
int i;
parser>>i;
return i;
}