cout << stringstream

MCP*_*MCP 20 c++ stringstream

当我把一些东西放进一个字符串流中时,让我们说一个实数,如果我然后将该stringstream对象插入cout ......我在看什么?

通常我会得到一些奇怪的数字.这是一个记忆位置吗?只是好奇.

看起来下面的评论命中了它,但这是我正在尝试做的事情:

string stringIn; 
stringstream holdBuff;
holdBuff << getline(cin, stringIn);
cout << holdBuff; 
Run Code Online (Sandbox Code Playgroud)

基本上我只是在插入stringIn时试图看看holdBuff是什么样的.我试图让用户输入一个字符串,然后我想逐步查找它的内容,并可能转换...

Jam*_*nze 22

你怎么看

holdBuff << getline(cin, stringIn);
Run Code Online (Sandbox Code Playgroud)

是在做.返回类型getlinecin在这种情况下对read()的流的引用.由于没有<<定义哪个接受std::istream第二个参数,编译器尝试不同的转换:在C++ 11中,std::istream有一个隐式转换 bool,在早期的C++中,隐式转换为std::ios*或类似的东西(但是唯一有效的用途)返回值是将其转换为bool).所以你要么输出1(C++ 11),要么输出一些随机地址(实际上,通常是流的地址,但这不能保证).如果你想把调用的结果 getline变成一个std::ostringstream,你需要两个操作(检查它们之间的错误):

if ( !getline( std::cin, stringIn ) )
    //  Error handling here...
holdBuff << stringIn;
Run Code Online (Sandbox Code Playgroud)

同样,要写一个内容std::ostringstream,

std::cout << holdBuf.str() ;
Run Code Online (Sandbox Code Playgroud)

是正确的解决方案.如果您坚持使用std::stringstream 何时std::ostringstream更合适,您还可以:

std::cout << holdBuf.rdbuf();
Run Code Online (Sandbox Code Playgroud)

然而,第一种解决方案是优选的,因为它更加惯用.

在任何情况下,再一次,没有<<运算符采用任何 iostream类型,因此您最终得到隐式转换bool或指针的结果.


Bo *_*son 21

是的,您可能会看到stringstream的地址.

如果要显示其包含的字符串,请尝试

cout << stream.str();
Run Code Online (Sandbox Code Playgroud)


Mic*_*ker 6

cout << s.rdbuf();
Run Code Online (Sandbox Code Playgroud)

是你想要的。或者你可能想要

cout << s.str();
Run Code Online (Sandbox Code Playgroud)

但这在资源方面可能更昂贵。


Goz*_*Goz 6

是的,它很可能是某种形式或其他形式的记忆位置.很可能它是指向stringstream对象本身的指针.

您可以通过以下方式确认:

std::stringstream ss;
unsigned long long ll = (unsigned long long)&ss;
cout << ll;
Run Code Online (Sandbox Code Playgroud)

也就是说当你想要一个字符串流时,你应该使用str()函数,如下所示:

cout << ss.str();
Run Code Online (Sandbox Code Playgroud)