std::string为何没有format函数呢?

clever101
博客专家认证
2008-07-05 05:50:44
感觉std::string没有format函数,用起来没有MFC的CString方便。我搞不清为何std::string为何没有format函数(就是格式化字符串函数)呢?
...全文
1727 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2008-07-06
  • 打赏
  • 举报
回复
>不过,像是cstring的format类的函数,有什么不安全的?没碰上过问题呀
CString的Format,类似于sprintf。只是没有缓冲区溢出的问题,但在类型上是不安全的。比如你指定了格式化符号是"%f",但是你并不能保证传入的参数就是浮点数。这和C++的类型系统是冲突的。
可以看看《Exceptional C++ Style》第二条和第三条。
du51 2008-07-06
  • 打赏
  • 举报
回复
对不起..当时可能比较晚了.言语欠斟酌了.
实在不好意思.

我想了下.可能确实是不安全的原因吧.

我当时的意思是C++的IO都是基于流的.无论是IOSTREAM 还是STRINGSTREAM ,STRSTREAM
当然了,<< >>本来就是一种流的运算.

我觉得C++里..一大堆里<< >>里出现一个vsnprintf之类的,不是很协调..
BetterMind 2008-07-06
  • 打赏
  • 举报
回复
学习。。。
two_ears 2008-07-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 iambic 的回复:]
>和安全不安全没太大关系..
>MALLOC安全吗...STL一样用.
你这个例子举得比较差。format之类的函数是实现出来给用户用的接口。STL有把malloc或者类似的东西暴露给用户吗?若按你这样推理,世界上就没有任何东西是基于安全性考虑而被废弃的了。

>基于流的和这些东西语意冲突
什么是基于流的?std::string是基于流的?和什么语意冲突?
[/Quote]

我也没看明白什么是基于流的,不过,像是cstring的format类的函数,有什么不安全的?没碰上过问题呀
iambic 2008-07-06
  • 打赏
  • 举报
回复
>和安全不安全没太大关系..
>MALLOC安全吗...STL一样用.
你这个例子举得比较差。format之类的函数是实现出来给用户用的接口。STL有把malloc或者类似的东西暴露给用户吗?若按你这样推理,世界上就没有任何东西是基于安全性考虑而被废弃的了。

>基于流的和这些东西语意冲突
什么是基于流的?std::string是基于流的?和什么语意冲突?
du51 2008-07-06
  • 打赏
  • 举报
回复
和安全不安全没太大关系..
MALLOC安全吗...STL一样用.


基于流的和这些东西语意冲突
iambic 2008-07-06
  • 打赏
  • 举报
回复
>格式化有很多种方法,啊,
>1,sprintf函数可以实现格式化字符串,并保存到一个字符数组
>2,snprintf也能实现但比起sprintf函数稍微要安全一些了啊
>3,ostringstream对象也能实现字符串的格式化,并比sprintf和snprintf函数要好得多,主要是安全得多,但没他们那么效率高
>4,ostrstream也能实现对象的格式化,但一般都没有用,用得最多的是ostringstream的对象
>另外boost里面也有一个更为灵活的lexical_cast函数也可以实现字符串的格式化..
把《Exceptional C++ Style》的东西搬出来,但是不点明参考,不太厚道吧。
王旺旺旺 2008-07-05
  • 打赏
  • 举报
回复
#include <string>
#include <sstream>

using namespace std;


template<typename T>
T GetStrValue(char* str)
{
string strValue = str; //转换为string
istringstream osValue;
osValue.str(strValue); //得到istrstream

T value;
osValue >> value; //得到数值

return value;
}

//=============================
#include "main.h"

#include <iostream>

using namespace std;

int main()
{
char test[15] = "-2001234567";

long res = GetStrValue<long>(test);

cout << "test str: " << test << endl;
cout << "long value: " << res << endl;
}
王旺旺旺 2008-07-05
  • 打赏
  • 举报
回复
format是干么用的?
zhangjundriver 2008-07-05
  • 打赏
  • 举报
回复
格式化有很多种方法,啊,
1,sprintf函数可以实现格式化字符串,并保存到一个字符数组
2,snprintf也能实现但比起sprintf函数稍微要安全一些了啊
3,ostringstream对象也能实现字符串的格式化,并比sprintf和snprintf函数要好得多,主要是安全得多,但没他们那么效率高
4,ostrstream也能实现对象的格式化,但一般都没有用,用得最多的是ostringstream的对象
另外boost里面也有一个更为灵活的lexical_cast函数也可以实现字符串的格式化..
red_berries 2008-07-05
  • 打赏
  • 举报
回复
不知道什么,高手给讲一下
iambic 2008-07-05
  • 打赏
  • 举报
回复
因为不安全。
JeffreyX 2008-07-05
  • 打赏
  • 举报
回复
C++标准库提倡的方式:

#include <sstream>

ostringstream s;
s<<111<<","<<222;


boost库好像有个
boost::format(...)也可以达到你期望的效果

我一般都是用C运行库的_snprintf(...)
K行天下 2008-07-05
  • 打赏
  • 举报
回复
因为你可以使用 sstream 流
K行天下 2008-07-05
  • 打赏
  • 举报
回复
因为你可以使用 sstream 流
bitxinhai 2008-07-05
  • 打赏
  • 举报
回复
std::string没有封装这个方法,
可以自己写一个这样的方法!!!
lyle3 2008-07-05
  • 打赏
  • 举报
回复
自己写个呗~

64,671

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧