黄蜷流会工作吗 将 int 转换为刺痛

Would a stingstream work to convert an int to a sting?

本文关键字:转换 int 工作 黄蜷流      更新时间:2023-10-16

我最近读到一个关于将字符串转换为整数的问题 - (在 C++ 中将 int 转换为字符串的最简单方法(。

我知道 itoa 是什么,但什么是字符串流以及如何使用它们?我正在尝试实现一种方法来判断整数是否是"回文",我想将每个输入更改为字符串以找出它是否是回文。谢谢任何人的回答!

字符串

流是通过 C++ 标准库提供的三种C++样式输入/输出缓冲区之一:文件流、字符串流和数组流,尽管数组流已弃用。就像文件流读取文件和从文件读取文件流一样,字符串流将读取字符串和从字符串读取。

它们的运算符也类似于文件流:operator>>将使用流中的源数据将信息读入变量以确定结果,operator<<会将右侧操作数中的数据放入字符串流中。任何在istream上运行的函数都将在istringstream上运行,类似地,任何在ostream上运行的函数都将在ostringstream上运行,因为字符串流继承自这些各自的基类。

字符串流的内部缓冲区可以通过调用其成员函数str()来访问,该函数获取或设置基础字符串对象

我主要看到输入字符串流被用作将文本数据放入变量的方法,当原始字符串仅一次全部可用时,以及将标记化应用于较大文本数据的特定部分时。另一个用例可能是将字符串传递给一个函数,该函数需要根据字符串中的信息提供不同的信息:[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的标准库函数集。也许您还有另一个类 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";
}

输出

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一样运行,允许输入和输出操作。所有三种字符串流类型都有窄变体和宽变体。更多信息可在维基上找到:


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

但它不擅长的是转换用户输入。 它不会告诉您输入字符串是否为"仓鼠"。它只会返回 0。对于OP的情况来说,这不是问题,输入是一个数字,但我通常建议使用std::strtol。您可以测试 null 字符的 end 参数,以查看是否已解析整个字符串。

顺便说一句,您不需要将数字转换为字符串。这是一个经过充分研究的问题,有很多很多解决方案。