我最近读到了一个关于将字符串转换为整数的问题 - (Easiest way to convert int to string in C++)。
我知道itoa是什么,但是什么是stringstreams以及它们是如何使用的?我试图实现一种方法来判断整数是否是“回文”,我想将每个输入更改为字符串,以确定它是否是回文。感谢任何人的回答!
答案 0 :(得分:2)
Stringstreams是通过c ++标准库提供的三种C ++样式输入/输出缓冲区之一:文件流,字符串流和数组流,但不推荐使用数组流。就像从文件读取文件流和从文件读取文件流一样,字符串流将从字符串读取数据。
他们的操作符也像文件流一样:operator>>
将使用流中的源数据将信息读入变量以确定结果,operator<<
将从右侧放置数据 - 手操作数进入stringstream。在istream
上运行的任何函数都将在istringstream
上运行,类似地,对ostream
运算的任何函数都将在ostringstream
上运行,因为字符串流继承自str()
基类。
可以通过调用gets or sets the underlying string object
的成员函数void doDifferentThingsFromString(const std::string &str){
std::string
command;
std::istringstream
stream{str}; // construct an input string stream
stream >> command;
if(command == "line"){
std::cout << stream.str() << '\n';
}
else{
std::cout << "not line!\n";
}
}
int main(){
doDifferentThingsFromString("line Alice and \nBob were having an adventure.");
doDifferentThingsFromString("well this won't print anything at all");
}
来访问字符串流的内部缓冲区
我主要看到输入字符串流用作将原始字符串一次全部可用时将文本数据放入变量的方法,以及将标记化应用于较大文本数据的特定部分时的输入字符串流。另一个用例可能是将字符串传递给需要不同信息的函数,具体取决于字符串中的信息:[Coliru]:
line Alice and
Bob were having an adventure.
not line!
输出
to_string
虽然第二次调用当然确实打印了一些东西 - 但不是提供的参数。
另一方面,输出字符串流对于将数据序列转换为字符串非常有用。假设你有一个整数和一个双,你想要反转显示它们。遗憾的是,由于某种原因,您的编译器没有实现Foo
的标准库函数集。也许你有另一个类ostringstream
,打印起来有点复杂,你已经有了打印功能,而且你不想为这一小段代码编写一个字符串转换函数。好消息!你不必!
使用std::string reverse(const std::string &original){
return std::string{original.rbegin(), original.rend()};
}
void printReversed(int integer, double floatingPoint){
std::ostringstream
stream;
stream << integer << ", " << floatingPoint;
std::cout << reverse(stream.str()) << '\n';
}
template <typename Container_>
void printContainer(std::ostream &out, const Container_ &container){
for(auto &&element : container){
out << element << ", ";
}
out << "\n";
}
int main(){
printReversed(17, 43.21);
std::ostringstream
stream;
printContainer(stream, "never eat soggy waffles");
std::cout << reverse(stream.str()) << "\n";
}
,您可以像使用文件流一样简单地将数据读入流中,然后获取结果字符串,并根据需要操作字符串。 [Coliru]:
12.34 ,71
, ,s ,e ,l ,f ,f ,a ,w , ,y ,g ,g ,o ,s , ,t ,a ,e , ,r ,e ,v ,e ,n
输出
stringstream
还有fstream
与Shell Script Invocation Error: Command /bin/sh failed with exit code 2
一样运行,并允许输入和输出操作。所有三种stringstream类型都有窄变量和宽变量。有关更多信息,请访问wiki:
答案 1 :(得分:0)
Stringstream是一个像cin或cout一样的流,但另一端是内存而不是IO设备。通过谷歌搜索可能更好地解释,但可能出现的前几个是
http://www.cplusplus.com/reference/sstream/stringstream/
和
http://en.cppreference.com/w/cpp/io/basic_stringstream
使用它将整数转换为字符串很简单:
std::string toString(int in)
{
std::stringstream stream;
stream << in;
return stream.str();
}
但处理更多种类的输入更为有用。
template<class TYPE>
std::string toString(TYPE in)
{
std::stringstream stream;
stream << in;
return stream.str();
}
将字符串转换回来也很简单:
template<class TYPE>
TYPE fromString(std::string in)
{
std::stringstream stream(in);
TYPE rval;
stream >> rval;
return rval;
}
但是转换用户输入很糟糕。它不会告诉你输入字符串是否是“仓鼠”。它只会返回0.对于OP来说这不是问题,输入是一个数字,但我通常建议使用std::strtol。您可以测试null字符的end参数,以查看是否已解析整个字符串。
顺便说一句,您不需要将数字转换为字符串。 This is a very well examined problem with many, many solutions.