sprintf以及字符串格式化

sprintf是传统的c字符串格式化函数.用法:

#include<stdio.h>    char buffer[10];     sprintf(buffer,"%d",6666);//将一个整形值转化为c字符串形式

其优点: 1.效率最佳 2. 易用性与清晰性

缺点: 1.长度安全性引起缓冲区溢出,破坏内存2. 类型安全性问题 3. 不能应用于模板

在windows平台中 winsdk提供了安全字符串系列函数,来取代传统的有缓冲区溢出的字符串函数.实例:

#include<Strsafe.h>        char buffer[30];         StringCchPrintf(buffer, 30, "%d",6666);

windows下的c或倾向于c的c++程序应该使用安全字符串函数代替旧的函数.在vc2010环境实测,同时包含stdio.h, Strsafe.h则sprintf(buffer,"%d",6666);编译不能通过:提示让用安全的StringCchPrintf函数代替sprintf.snprintf 和_snprintf也同样该被StringCchPrintf替代.

下面来看c++的替代方案.

1.std::stringstream,其优点和缺点正和sprintf相反

#include <sstream>        ostringstream temp;        temp<<6666;        cout<<temp.str();

2.boost::lexical_cast,是stringstream的包装类,它并不是为格式化字符串而生(boost::format),它的作用是数据类型转化.因该和C里面的atoi等转换函数放在一起讨论.其实现代码大致为:

template<typename Target, typename Source>    Target lexical_cast(Source arg)    {        Target result;        if(!(interpreter << arg && interpreter >> result))          BOOST_LCAST_THROW_BAD_CAST(Source, Target);        return result;    }

使用方法:

include "boost/lexical_cast.hpp"

string result=lexical_cast(6666);

3.boost::format,请参考boost文档



(boost作为准标准库,值得讨论, MFC中的CString.Format 等不做讨论)



总结:

  1. 如果只是将一个值转化为字符串,尽量使用lexical_cast,如果你正在使用boost库的话,如果是格式化,请使用boost::format
  2. 如果没有安装boost,或者还要进行格式换字符串,尽量使用stringstream
  3. 如果你在windows下工作,并且追求效率,请使用安全字符串函数StringCchPrintf
  4. 再如果的话,你是该考虑_snprintf ,snprintf?
  5. 最后,放弃sprintf吧,永远不要使用它了.
    原文链接: https://www.cnblogs.com/LoveLyre/archive/2011/09/13/2175030.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/32205

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午9:27
下一篇 2023年2月8日 上午9:27

相关推荐