stingstream 可以将 int 转换为 sting 吗?
Would a stingstream work to convert an int to a sting?
我最近读到一个关于将字符串转换为整数的问题 - (Easiest way to convert int to string in C++)。
我知道 itoa 是什么,但什么是字符串流以及如何使用它们?我正在尝试实现一种方法来判断整数是否为 "palindrome" 并且我想将每个输入更改为字符串以查明它是否是回文。感谢任何人的回答!
Stringstreams 是通过 c++ 标准库可用的三种 C++ 样式 input/output 缓冲区之一:文件流、字符串流和数组流,但数组流已被弃用。就像文件流读取文件和从文件读取一样,字符串流将读取字符串和从字符串读取。
它们的运算符也就像文件流:operator>>
将使用流中的源数据将信息读入变量以确定结果,operator<<
将数据从右手操作数放入字符串流中。任何在 istream
上运行的函数都将在 istringstream
上运行,类似地,任何在 ostream
上运行的函数都将在 ostringstream
上运行,因为字符串流继承自各自的基础 classes.
字符串流的内部缓冲区可以通过调用它们的成员函数 str()
来访问,其中 gets or sets the underlying string object
我经常看到输入字符串流被用作一种将文本数据放入变量的方法,当原始字符串一次只能全部可用时,以及将标记化应用于较大文本数据的特定部分时。另一个用例可能是将字符串传递给需要不同信息的函数,具体取决于字符串中的信息:[Coliru]:
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");
}
输出
line Alice and
Bob were having an adventure.
not line!
当然,第二次调用确实打印了一些东西——只是不是提供的参数。
另一方面,输出字符串流可用于将数据序列转换为字符串。假设您有一个整数和一个双精度数,并且您希望将它们颠倒显示。不幸的是,出于某种原因,您的编译器没有实现 to_string
的标准库函数集。可能你还有一个class,Foo
,打印起来有点复杂,而你已经有了它的打印函数,你不想只为这个写一个字符串转换函数一点代码。好消息!你不必!
使用 ostringstream
,您可以像使用文件流一样简单地将数据读入流中,然后获取结果字符串,并根据需要操作该字符串。 [Coliru]:
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";
}
产出
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
,允许输入和输出操作。所有三种字符串流类型都有窄变体和宽变体。更多信息可在 wiki 上找到:
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;
}
但它不擅长的是转换用户输入。它不会告诉您输入字符串是否为 "hamster"。它只会 return 0。对于 OP 来说这不是问题,输入是一个数字,但我通常建议使用 std::strtol。您可以测试空字符的结束参数以查看是否解析了整个字符串。
顺便说一句,您不需要将数字转换为字符串。 This is a very well examined problem with many, many solutions.
我最近读到一个关于将字符串转换为整数的问题 - (Easiest way to convert int to string in C++)。
我知道 itoa 是什么,但什么是字符串流以及如何使用它们?我正在尝试实现一种方法来判断整数是否为 "palindrome" 并且我想将每个输入更改为字符串以查明它是否是回文。感谢任何人的回答!
Stringstreams 是通过 c++ 标准库可用的三种 C++ 样式 input/output 缓冲区之一:文件流、字符串流和数组流,但数组流已被弃用。就像文件流读取文件和从文件读取一样,字符串流将读取字符串和从字符串读取。
它们的运算符也就像文件流:operator>>
将使用流中的源数据将信息读入变量以确定结果,operator<<
将数据从右手操作数放入字符串流中。任何在 istream
上运行的函数都将在 istringstream
上运行,类似地,任何在 ostream
上运行的函数都将在 ostringstream
上运行,因为字符串流继承自各自的基础 classes.
字符串流的内部缓冲区可以通过调用它们的成员函数 str()
来访问,其中 gets or sets the underlying string object
我经常看到输入字符串流被用作一种将文本数据放入变量的方法,当原始字符串一次只能全部可用时,以及将标记化应用于较大文本数据的特定部分时。另一个用例可能是将字符串传递给需要不同信息的函数,具体取决于字符串中的信息:[Coliru]:
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");
}
输出
line Alice and
Bob were having an adventure.
not line!
当然,第二次调用确实打印了一些东西——只是不是提供的参数。
另一方面,输出字符串流可用于将数据序列转换为字符串。假设您有一个整数和一个双精度数,并且您希望将它们颠倒显示。不幸的是,出于某种原因,您的编译器没有实现 to_string
的标准库函数集。可能你还有一个class,Foo
,打印起来有点复杂,而你已经有了它的打印函数,你不想只为这个写一个字符串转换函数一点代码。好消息!你不必!
使用 ostringstream
,您可以像使用文件流一样简单地将数据读入流中,然后获取结果字符串,并根据需要操作该字符串。 [Coliru]:
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";
}
产出
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
,允许输入和输出操作。所有三种字符串流类型都有窄变体和宽变体。更多信息可在 wiki 上找到:
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;
}
但它不擅长的是转换用户输入。它不会告诉您输入字符串是否为 "hamster"。它只会 return 0。对于 OP 来说这不是问题,输入是一个数字,但我通常建议使用 std::strtol。您可以测试空字符的结束参数以查看是否解析了整个字符串。
顺便说一句,您不需要将数字转换为字符串。 This is a very well examined problem with many, many solutions.