免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5662 | 回复: 11
打印 上一主题 下一主题

string类中,有象snprintf这样方便的功能吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-06 19:27 |只看该作者 |倒序浏览
string类中,有象snprintf这样方便的功能吗?

string类中提供replace的方法,不过不太可能把字符给数出来吧。

我觉得snprintf实在是方便。不知道如果使用string类,如何实现它?

论坛徽章:
0
2 [报告]
发表于 2004-04-06 20:19 |只看该作者

string类中,有象snprintf这样方便的功能吗?

关注

论坛徽章:
0
3 [报告]
发表于 2004-04-07 09:52 |只看该作者

string类中,有象snprintf这样方便的功能吗?

>;>; 我觉得snprintf实在是方便。不知道如果使用string类,如何实现它?

string是用来处理字符型数据的类,其数据类型决定了它只能处理string、char* 和 char 型的数据,所以没有如snprintf那样的数据类型转换的功能。

如果想在C++中进行数据类型转换,除了用snprintf等函数这一传统的实现方式之外,可以借助于C++标准库中提供的stringstream类来实现。参见下面的程序。

  1. #include <iostream>;
  2. #include <sstream>;
  3. #include <string>;
  4. using namespace std;

  5. // type converting function
  6. template <typename Target, typename Source>;
  7. Target type_cast(const Source& src)
  8. {
  9.   stringstream ss;
  10.   ss << src;
  11.   Target tar;
  12.   ss >;>; tar;
  13.   return tar;
  14. }

  15. // test
  16. int main()
  17. {
  18.   int a = type_cast<int>;("123");
  19.   double b = type_cast<double>;("123.45");
  20.   string s;
  21.   s = type_cast<string>;( '#' ) + "---" + type_cast<string>;( 123.45 ) + "#";
  22.   cout << a << endl;
  23.   cout << b << endl;
  24.   cout << s << endl;
  25. }
复制代码

有了这样一个类似的 type_cast() 函数之后,在C++中数据类型转换问题就基本上解决了,不必再为类似的问题而感到困扰了。

如果想更安全更精确地进行数据类型转换,建议使用 Boost 库中提供的 lexical_cast() 类型转换函数。

>;>; string类中提供replace的方法,不过不太可能把字符给数出来吧。
不明白是什么意思。能举个例子具体说明一下吗?

论坛徽章:
0
4 [报告]
发表于 2004-04-07 10:00 |只看该作者

string类中,有象snprintf这样方便的功能吗?

同感,一直没找到合适的方法,倒是vc的CString 有个format 方法挺好用,可惜这儿用不了.

论坛徽章:
0
5 [报告]
发表于 2004-04-07 10:30 |只看该作者

string类中,有象snprintf这样方便的功能吗?


  1. string类中提供replace的方法,不过不太可能把字符给数出来吧。
  2. 不明白是什么意思。能举个例子具体说明一下吗?
复制代码


首先多谢您的回复。昨天晚上在故纸堆中,翻到裘宗燕的一篇文章,就是说的这个问题。他指出了变通方法,但是和snprintf相比还是有差距。

我这里是说string中的replace方法,可以替换字符串。
比如:

  1. string a = "abcdefg";
  2. a.replace(4,7, "1234");

  3. cout << a << endl;

  4. 结果:
  5. abc1234
复制代码


就是这样的替换功能。

论坛徽章:
0
6 [报告]
发表于 2004-04-07 10:41 |只看该作者

string类中,有象snprintf这样方便的功能吗?

>;>; 但是和snprintf相比还是有差距
各有千秋吧。snprintf只能完成(整型、实型等)到字符型的转换,而我上面给出的 type_cast 函数可以实现任意类型之间的类型转换,只要转换的类定义了 << 或者 >;>; 实现。

>;>; string类中提供replace的方法,不过不太可能把字符给数出来吧。
对你的后半句不理解。

论坛徽章:
0
7 [报告]
发表于 2004-04-07 13:28 |只看该作者

string类中,有象snprintf这样方便的功能吗?

>;>; string类中提供replace的方法,不过不太可能把字符给数出来吧。
对你的后半句不理解。
噢,我的意思是这样:
snprintf(sbuf, BUFSIZ, "error is: %s", strerror);

我这里如果要用string的话,可以这样定义
string err = "error is: %s";
err.replace(10,11, strerror);
这样把字符串给替换到string中,可以取得和snprintf类似的效果。但是必须“数”出来%s的位置。


>;>; 各有千秋吧。snprintf只能完成(整型、实型等)到字符型的转换,而我上面给出的 type_cast 函数可以实现任意类型之间的类型转换,只要转换的类定义了 << 或者 >;>; 实现。

确实如您所说,snprintf不是用于类型转换。c语言中有其它的语法可以进行类型转换。

我希望c++有一个类似于snprintf这样,在实践中会广泛使用的、简洁的代换字符串的方法,它可以直接操作string类,或者由string类提供。

论坛徽章:
0
8 [报告]
发表于 2004-04-07 13:59 |只看该作者

string类中,有象snprintf这样方便的功能吗?

>;>; string err = "error is: %s";
>;>; err.replace(10,11, strerror);

string err = "error is: ";
err += strerror;
这样不更简单吗?没有仔细看我上面给你的程序吧。另外,你的思路也要转换一下了,不要让定向思维束缚了你。

论坛徽章:
0
9 [报告]
发表于 2004-04-07 14:21 |只看该作者

string类中,有象snprintf这样方便的功能吗?


  1. string err = "error is: ";
  2. err += strerror;
  3. 这样不更简单吗?没有仔细看我上面给你的程序吧。另外,你的思路也要转换一下了,不要让定向思维束缚了你。
复制代码


是的,在这个例子中string类并不落后。我没有注意这个例子的特殊性。

比如我对odbc编程,需要用sql语句。
如果用snprintf,我可以

  1. #define SQL_FIND_USER "select a.name, b.type from emp a, type b where a.name = %s and b.type >; %d and a.typeid = b.id"
  2. snprint(sbuf, BUFSIZ, SQL_FIND_USER, sName, iType);
  3. odbc.exec(sbuf);
复制代码


可是这样的替换,用string类就费劲了。您说呢?

论坛徽章:
0
10 [报告]
发表于 2004-04-07 14:53 |只看该作者

string类中,有象snprintf这样方便的功能吗?

假设 sbuf 是 string 类。

  1. sbuf = sbuf + "select a.name, b.type from emp a, type b where a.name = " + sName + " and b.type >; " + type_cast<string>;( iType) + " and a.typeid = b.id";
  2. odbc.exec( sbuf.c_str() );
复制代码

如果你嫌书写麻烦,或者这一格式经常使用的话,还可以写成函数或者定义为宏。那只是形式上的问题了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP