缓冲区方法你有被stringstream坑过吗?

新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

    stringstream用常来安全的格式化若干个字符串,值数到一个缓冲区, 而用不担忧溢出, 可以用来代取snprintf.
但是很多人都在用使stringstream的时候到遇因为stringstream外部的缓冲区没有确正的空清致使的题问.

那么把stringstream类外部的缓冲区确正的空清方法是什么呢?
stringstream ss;
谜底是: ss.str("") 方法.
另外,如果需要把格式化后的字符串通过>>输出到字符串, 必须每次都调用clear()方法!

所以, 保险期间, 每次缓冲区格式化后, 都通过clear(), str("") 两个数函都调用, 把stingstream类位复.

    
PS1: 网上有一些论讨, 说ss.str("")方法不管用, 而通过 ss.str().clear(); 这多是c++标准库的实现方法不分歧致使. 可以自行看下代码库用引的sstream文件的源码.
       在我的linux器机上, /usr/include/c++/4.1.0/sstream, 以及vs2008的实现, 都是和本文是分歧的.
PS2: 注意str() 和 str("") 的区分
       str() 是返回外部缓冲区的一个copy, str("") 是空清外部缓冲区.

测试程序:

#include <sstream>
#include <stdio.h>
using namespace std;
int main()
{
    stringstream ss;
    string result;
    int n=1;
    ss.clear();                                                                                                                                                                  
    ss<<n;
    ss>>result;
    printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str());

    n=2;     ss.clear();     ss<<n;     ss>>result;     printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str());

    n=3;     ss.str("");     ss<<n;     ss>>result;     printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str());

    n=4;     ss.clear();     ss.str("");     ss<<n;     ss>>result;     printf("result : %s, str : %s\n", result.c_str(), ss.str().c_str()); }

    
 

    每日一道理
整个世界,因为有了阳光,城市有了生机;细小心灵,因为有了阳光,内心有了舒畅。明媚的金黄色,树丛间小影成像在叶片上泛有的点点破碎似的金灿,海面上直射反映留有的随波浪层层翻滚的碎片,为这大自然创造了美景,惹人醉的温馨之感,浓浓暖意中夹杂着的明朗与柔情,让雨过天晴后久违阳光的心灵重新得到了滋润!

    测试结果:
result : 1, str : 1
result : 2, str : 12 // 调用了clear(), 没有调用str(""), 结果错误.
result : 2, str :    // 调用了 str(""), 没有调用clear(), 结果错误.
result : 4, str : 4 // 调用了 clear()和str(""), 结果确正.

 

    附上str("")和str()的外部实现:

/** 
       *  @brief  Setting a new buffer.
       *  @param  s  The string to use as a new sequence.
       *   
       *  Deallocates any previous stored sequence, then copies @a s to
       *  use as a new one.
      */  
      void
      str(const __string_type& __s)
      {   
    // Cannot use _M_string = __s, since v3 strings are COW.
    _M_string.assign(__s.data(), __s.size());
    _M_stringbuf_init(_M_mode);
      }

    
 

// Get and set:
      /**
       *  @brief  Copying out the string buffer.
       *  @return  A copy of one of the underlying sequences.
       *
       *  "If the buffer is only created in input mode, the underlying
       *  character sequence is equal to the input sequence; otherwise, it
       *  is equal to the output sequence." [27.7.1.2]/1
      */
      __string_type
      str() const
      {
    __string_type __ret;
    if (this->pptr())
      {
        // The current egptr() may not be the actual string end.
        if (this->pptr() > this->egptr())
          __ret = __string_type(this->pbase(), this->pptr());
        else
          __ret = __string_type(this->pbase(), this->egptr());
      }
    else
      __ret = _M_string;
    return __ret;
      }

    
 

文章结束给大家分享下程序员的一些笑话语录: 程序语言综述
CLIPPER 程序员不去真的猎捕大象,他们只是购买大象部分的库然后花几年的时间试图综合它们。
DBASE 程序员只在夜间猎捕大象,因为那时没人会注意到他们还在使用石弓。
FOXPRO 程序员开始使用更新更好的步枪,这使他们花掉比实际狩猎更多的时间学习新的射击技术。
C 程序员拒绝直接购买步枪,宁可带着钢管和一个移动式机器车间到非洲,意欲从零开始造一枝完美的步枪。
PARADOX 程序员去非洲时带着好莱坞关于猎捕大象的电影剧本,他们认为照剧本行事就会逮到一头大象。
ACCESS 程序员在没有任何猎象经验的经验下就出发了,他们穿着华丽的猎装、带着全部装备,用漂亮的望远镜找到了大象,然后发觉忘了带扳机。
RBASE 程序员比大象还要稀少,事实上,如果一头大象看到了一个RBASE程序员,对他是个幸运日。
VISUAL ACCESS 程序员装上子弹、举起步枪、瞄准大象,这使大象感到可笑,究竟谁逃跑。他们无法抓住大象,因为由于他们对多重控制的偏爱,他们的吉普车有太多的方向盘因而无法驾驶。
ADA、APL和FORTRAN 程序员与圣诞老人和仙女一样是虚构的。
COBOL 程序员对和自己一样濒临灭绝的大象寄予了深切的同情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值