Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Stringstream将字符串转换为Int_C++_String_Casting_Int_Transformation - Fatal编程技术网

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;
}