回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++源代码 >> C/C++ 小程序 >> [C++] 不怕溢出的 sprintf
最 近 更 新
[C++] 去除文件中重复的..
C++ Primer 第四版源代码
[C++] 不怕溢出的 sprintf
文件分割合并器(加入图..推荐
[C++] 简单垃圾回收器推荐
清除多余空格
[C++] dump file推荐
爱因斯坦阶梯问题
简单加密程序源代码
[C++] 最大公约数求解
最 新 推 荐
文件分割合并器(加入图..推荐
[C++] 简单垃圾回收器推荐
[C++] dump file推荐
热 门 排 行
简单加密程序源代码
爱因斯坦阶梯问题
[C++] dump file推荐
C++ Primer 第四版源代码
清除多余空格
文件分割合并器(加入图..推荐
[C++] 最大公约数求解
[C++] 简单垃圾回收器推荐
[C++] 去除文件中重复的..
[C++] 不怕溢出的 sprintf
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

[C++] 不怕溢出的 sprintf


来源:蚂蚁的 C/C++ 标准编程 作者:Antigloss 等级:一般
发布于2007-07-26 12:10 被读1272次 【字体:

功能没有 sprintf 那么完善就是了。

#include <cassert>
#include <cstdarg>

#include <sstream>
#include <string>

using namespace std;

string& stringprintf( string &s, const char *fmt, ... )
{
    assert( s.empty() );

    va_list ap;
    va_start(ap, fmt);
    const char *next_c; // next character
    while ( *fmt != '\0' )
    {
        switch ( *fmt )
        {
            case '%':
            {
                next_c = fmt + 1;
                switch ( *next_c )
                {
                    case '\0':
                        s += *fmt;
                        break;
                    case '%':
                        s += '%';
                        ++fmt;
                        break;
                    case 's':
                        s += va_arg(ap, char*);
                        ++fmt;
                        break;
                    case 'd':
                    {
                        ostringstream oss;
                        oss << va_arg(ap, int);
                        s += oss.str();
                        ++fmt;
                        break;
                    }
                    case 'f':
                    {
                        ostringstream oss;
                        oss << va_arg(ap, double);
                        s += oss.str();
                        ++fmt;
                        break;
                    }
                    default:
                        assert( !"format unsupported." );
                        break;
                }

                break;
            }
            default:
                s += *fmt;
                break;
        }

        ++fmt;
    }
    va_end(ap);

    return s;
}

-----------------------------------------------------

测试一下

int main()
{
    string s;
    stringprintf(s, "int: %d, double: %f, str: %s", 18, 18.55, "test");
    cout << s << endl;
}

结果如下:

    int: 18, double: 18.55, str: test

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:暂无相关专题

上一篇:文件分割合并器(加入图形界面)
下一篇:C++ Primer 第四版源代码

共有评论 2 条 网友评分 1分 查看全部评论

游客:zz
评分:0
既然是不怕溢出, 测试数据也应该长些吧----起码100K?
游客:tt
评分:1
非常不好用

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss