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

Jiong Tu jiongt at hz.webex.com
Tue Mar 7 16:08:20 CST 2006


你搞错了,不补0的是strncpy,不是snprintf


----- Original Message ----- 
From: "千里马肝" <oiramario at gmail.com>
To: "C++ Discuss Group" <cpp at codingnow.com>
Sent: Monday, March 06, 2006 1:35 PM
Subject: 答复: 答复: [cpp] 关于STL中string的问题


> 如果我没有记错的话
> _snprintf是不会自动补\0的
> 而sprintf会
> 所以要么char buf[32] = {0},要么_snprintf(... "%d\0"...)
> 另外vector的使用是为了配合&# 8220;不定长buf&# 8221;而存在,并非buf[32]的替代品
> 
> 考虑的方向不一样,写出来的代码自然不一样
> 逐渐,回答者们的答案,离提问者的出发点越来越远了
> 恕我直言,LZ的问题和错误weak了一点,其他人也扯远了(包括我),只有myan的回答应该是他想要的
> 
> 
> -----原始邮件-----
> 发件人: cpp-bounces at codingnow.com [mailto:cpp-bounces at codingnow.com]代表
> Wu Yongwei
> 发送时间: 2006年3月5日 18:22
> 收件人: C++ Discuss Group
> 主题: Re: 答复: [cpp] 关于STL中string的问题
> 
> 
> 呵呵,此处同意。vector加printf,又低效又不安全,两处没捞好。
> 
> 不过,要注意_snprintf和itoa都不是跨平台的标准函数。一般而言,使用
> snprintf(没有下划线)哪儿都行。还有,第二个常数32我认为写sizeof buf比较好。
> 
> 吴咏炜
> 
> analyst wrote:
> 
>> 为什么都喜欢用这么麻烦而且低效的东西,不要为了用C++而用C++,别忘了还有C
>>   char buf[32];
>>   _snprintf(buf, 32, "%d", 10);//或者用itoa(10, buf, 10);
>>   string str = buf;
>>  
>> 
>>  
>> 在06-3-3,*千里马肝* <oiramario at gmail.com <mailto: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> [mailto:
>>         cpp-bounces at codingnow.com <mailto:cpp-bounces at codingnow.com>]*代
>>         表 *苏益ꪏ
>>         *发送时间:* 2006年3月2日 14:54
>>         *收件人:* cpp at codingnow.com <mailto: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()返回首个字符的地址?这样做意义呵在?
> 
> _______________________________________________
> Cpp mailing list
> Cpp at codingnow.com
> http://codingnow.com/mailman/listinfo/cpp
> 
> _______________________________________________
> Cpp mailing list
> Cpp at codingnow.com
> http://codingnow.com/mailman/listinfo/cpp



More information about the Cpp mailing list