答复: 答复: [cpp] 关于STL中string的问题

千里马肝 oiramario at gmail.com
Fri Mar 3 11:11:48 CST 2006


如果这样
那不如直接使用boost::format导出一个stream的string,更安逸(当然会慢一些)

PS,对于FormatString为了保证format出来的是一个string,每次memset,个人认为无大必要,不如自动在formatstring的最后每次自动加上\0  (XD)
  -----原始邮件-----
  发件人: cpp-bounces at codingnow.com [mailto:cpp-bounces at codingnow.com]代表 Oscar.Ken
  发送时间: 2006年3月3日 10:58
  收件人: C++ Discuss Group
  主题: Re: 答复: [cpp] 关于STL中string的问题


  实际开发中可以试试用以下函数吧
  #ifdef  UNICODE

  # define tchar wchar_t
  # define tstring std::wstring

  #else

  # define tchar char
  # define tstring std::string

  #endif

  inline tstring FormatString(const tchar* fmt, ...)
  {
   static tchar tmp[2048];
   memset(tmp, 0, 2048 * sizeof(tchar));
   va_list args;
   va_start(args, fmt);
   int re = _vsntprintf(tmp, 2048, fmt, args); 
   va_end(args);
   return tstring(tmp);
  }
   
  C++的有些标准组件实现得很难用,有时有必要自己写点的。
  如果觉得2048个字符不够,试着自己改造一个template版本的吧。
   
  在06-3-3,千里马肝 <oiramario at gmail.com> 写道: 
    例码:
      std::vector<char> buf(buffer_size, 0);
      _snprintf(&buf[0], buffer_size, "%d\0", 10);
      // 赋值给字符串
      std::string str = &buf[0]; 
      MessageBox(NULL, str.c_str(), NULL, MB_OK);

    好处:
        1. 使用std::vector避免手动new/delete
        2. 使用stl可以 充分利用stl的alloc(如stlport的memory pool)
        3. 使用_snprintf防止溢出 
        4. std::string = std::vector(安逸:) 
      -----原始邮件-----
      发件人: cpp-bounces at codingnow.com [mailto: cpp-bounces at codingnow.com]代表 苏益ꪏ
      发送时间: 2006年3月2日 14:54
      收件人: cpp at codingnow.com
      主题: [cpp] 关于STL中string的问题


      请先看这段代码。
      ----------------------------------------------------------------
      //我希望把string赋值10,然后显示
      string Buffer;
      sprintf( Buffer.begin (),"%d",10);
      MessageBox(NULL,Buffer.begin(),NULL,MB_OK);
      ----------------------------------------------------------------

      建个程序,编译它,是通不过的。原因是Buffer没有初值,调用Buffer.begin()返回是NULL,第三句用MessageBox弹出一个NULL的字符串,这是不可取的。 

      所以我改正以后,程序为
      ---------------------------------------------------------------
      //改正后的程序
      string Buffer = "a"; //我随便给了个初值
      sprintf( Buffer.begin(),"%d",10);
      MessageBox(NULL,Buffer.begin (),NULL,MB_OK);
      ----------------------------------------------------------------
      但是,上面这段程序,可读性能差。别人会想:作者为什么给个"a"而不是"b"呢?

      所以我想请教大家:
      (1)这问题有没有更好的方法?最好不要MFC,也不用char数组,因为整个程序中其它地方我都用了string。 
      (2)STL为什么这么设计?
      难道定义Buffer以后,还没有分配空间?如果已经有空间,为什么不用Begin()返回首个字符的地址?这样做意义呵在?





            =============================================== 
            快来和我一起享受TOM免费邮箱吧! 看看除了1.5G,还有什么? 

                敲开精彩 聊天世界: 网通用户 电信用户 

            明星送祝福( http://sr.tom.com): 周杰伦  蔡依林  王力宏  田震  代您送去生日祝福 

            万首金曲免费送(http://mm.tom.com/ivr/) : 你到底爱谁   千年之恋  我是真的爱你   一辈子做你的女孩 

            全部彩铃免费送( http://mm.tom.com/cailing/): 我发财了发财了  你喜欢我就说嘛  两只蝴蝶   冲动的惩罚 
            ===============================================  


    _______________________________________________
    Cpp mailing list
    Cpp at codingnow.com
    http://codingnow.com/mailman/listinfo/cpp



-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://codingnow.com/pipermail/cpp/attachments/20060303/51df8e7f/attachment-0001.html


More information about the Cpp mailing list