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 上找到:

istringstream
ostringstream
stringstream

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.