社区
C++ 语言
帖子详情
std::string为何没有format函数呢?
clever101
博客专家认证
2008-07-05 05:50:44
感觉std::string没有format函数,用起来没有MFC的CString方便。我搞不清为何std::string为何没有format函数(就是格式化字符串函数)呢?
...全文
1727
17
打赏
收藏
std::string为何没有format函数呢?
感觉std::string没有format函数,用起来没有MFC的CString方便。我搞不清为何std::string为何没有format函数(就是格式化字符串函数)呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
自己写个呗~
std
::
string
format
格式化
函数
源代码及两种格式化方法
本程序提供了
std
::
string
类型的
Format
格式化
函数
,以及两种格式化
string
字符串的方法,主方法在str.hpp文件中,测试文件在
string
_
format
.cpp中,已测试可用
c++通用库针对不同平台封装(win)
只列出了一个头文件(WinUtils.h),详情看代码 //检测进程是否运行中 返回[运行中进程数量] 有多个 int checkProcess(
std
::
string
name); //通过路径和名称检测进程是否运行中 返回[运行中/非运行中] 只有一个 bool checkProcess(
std
::
string
path,
std
::
string
name); //通过PID检测进程是否运行中 返回[运行中/非运行中] 只有一个 bool checkProcessById(unsigned long pid); //启动进程 返回[进程pid/0] int startProcess(
std
::
string
path,
std
::
string
name); //服务启动程序 bool startProcessAsUser(
std
::
string
path,
std
::
string
name); //杀掉所有进程名为 name 的进程 杀掉所有 bool killProcessByName(
std
::
string
name); //杀掉指定进程pid 为 pid 的进程 杀掉一个 bool killProcessById(unsigned long pid); //杀死指定路径的进程 杀掉一个 bool killProcessByPath(
std
::
string
path,
std
::
string
file); //尝试连接 返回[成功/失败] bool ConnectTest(
std
::
string
ip, int port); //获取当前程序的路径 void getCurrencyPath(char* path); //获取当前程序的路径
std
::
string
getCurrencyPath(); //获取当前程序的路径
std
::w
string
getCurrencyPathW(); //输出日志 void Log(
std
::
string
info,
std
::
string
path = "", LogLevel level = LogLevel::LOG_INFO,bool
format
= true); void Log(
std
::
string
info, LogLevel level); //检测Dll是否存在 bool checkDllExist(const char *name); //屏幕截图
std
::
string
ScreenShot();
C++系列第2:C++2.0(11+14+17+20)详解及多线程实战
90 5.5.1 RAII 与引用计数 90 5.5.2
std
::shared_ptr 90 5.5.3
std
::unique_ptr 91 5.5.4
std
::weak_ptr 91 第6章 C++2.0多线程原理与实战 93 什么是并发 93 并发的方式 93 为什么使用并发 95 线程简介 96 创建线程...
format
:一个简单的头文件 C++11
std
格式 一个简单的头文件 C++11
std
::
string
格式化程序 用法:
std
::
string
test = util::
Format
( " This is a nice
string
with numbers {0} and
string
s {1} nicely
format
ted " , 123 , " hello " );
std
::
string
test = util::
Format
( " {0, 20} " , "
Format
ting is nice! " );
format
string
:一个C ++ 14类型的安全格式字符串库,深受Python的str.
format
()
函数
启发
格式字符串 一个C ++ 14类型的安全格式字符串库,很大程度上受Python的str.
format
()
函数
启发。 这更像是一种概念证明,在任何生产环境中任何人都不会使用,有测试,
没有
维护,并且效率可能很低。 因此,我认为您不想使用它,但是如果您想自己写类似的东西,则可能要看看它。 例子: # include < iostream> # include <
format
string
> using namespace
format
string
; int main () { // create a temp.
format
ting object that gets written to cout
std
::cout <<
format
( " hex: {:#x}, centerd: {:_^20}, padded: {:+010.3f} \n " ,
C++ 语言
64,671
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章