黄蜷流会工作吗 将 int 转换为刺痛
Would a stingstream work to convert an int to a sting?
我最近读到一个关于将字符串转换为整数的问题 - (在 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 参数,以查看是否已解析整个字符串。
顺便说一句,您不需要将数字转换为字符串。这是一个经过充分研究的问题,有很多很多解决方案。
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 将 int 数组转换为 std::vector<int*>
- 如何转换 int 变量并附加到常量 wchar_t*
- 类型转换<int>的舍入问题
- 在Objective-C中调用sqlite3数据库时,如何调用和转换int/NSNumber
- 转换 int -> 无符号长 长 是否由标准定义
- 简单的 int 到字符串转换..int to const char* 无效
- 如何将转换 int 除法键入为浮点数
- C++类型转换 int * 到类
- 预期的类型说明符,并且无法在初始化时转换“int*”
- 转换int并将其与char*连接
- 字符串流在转换int型时添加新行
- 转换int为字符串/char c++ /Arduino
- c# P-Invoke:如何转换INT fun(BYTE *bStream, UINT16 *nCount, const
- 类型转换(int**)和int(*)的区别
- 从"int"到"nodeType"的无效转换<int>
- 从无符号int构造对强制转换int的引用