举例如下:
CString strFormat;
std::string str = "abc";
strFormat.Format("%s%s",str, "def");为什么最后的结果是 strFormat == "abc"
而不是所预想的 "abcdef"如何才能实现 在Format的参数中 写入 std::string 的内容,而最终结果是我们所需要的,
方法不限,包括可以改动mfc的源代码如果成功了,我再新发一个帖子,再给100分谢谢

解决方案 »

  1.   

    // try it.
    CString strFormat;
    std::string str = "abc";
    strFormat.Format("%s", str);
    strFormat += "def";不能显示abcdef的原因我想是因为str的后面还有一个\0的结尾字符吧?(猜的)
      

  2.   

    先把std::string 转换为一个CString ,然后再Format不就可以了吗?
      

  3.   

    CString strFormat;
    std::string str = "abc";
    strFormat.Format("%s%s",str.c_str(), "def");
      

  4.   

    如下写法的确可以解决问题:
    CString strFormat;
    std::string str = "abc";
    strFormat.Format("%s%s",str.c_str(), "def");但是,为什么Mfc中的CString可以 这样写:
    CString strFormat;
    CString  str = "abc";
    strFormat.Format("%s%s",str, "def");而 std::string 必须再调用c_str()了?
    有没有什么办法 也实现 CString的写法呢?
    微软在 CString 中做了什么手脚呢?
    我 看了几遍CString的源码,也没有发现什么特别之处。请各路大虾赐教!!
      

  5.   

    CString可强制转化为LPCTSTR (operator LPCTSTR ) , std::string不行
      

  6.   

    你指的是 operator LPCTSTR() const; 吧
    可是我自己做了一个 CMyString,内部使用string
    也提供了一个 operator const char*() const; 也不行
      

  7.   

    我写的类头文件如下:
    class CMyString  
    {
    public:
    CMyString();
    ~CMyString(); operator const char* () const; void Format(const char* pchFormat, ...); std::string m_string;
    };cpp如下:const int nMaxLen = 512;void CMyString::Format(const char* pchFormat, ...)
    {
    va_list argList;
    va_start(argList, pchFormat);
    // FormatV(pwchFormat, argList);
    // va_end(argList); char * pchBuffer = new char[nMaxLen];
    // 下面不得已使用了编译器宏,原因是Microsoft不遵从ANSI的标准, 
    // vswprintf函数的接口定义的和ANSI不一样, 少了第二个参数:size_t, 表示buffer的大小
    // 所以如果在没有定义_SM_MSVC6和_SM_MSVC7的情况下,才加上第二个参数nMaxLen

    // int nWriteSize = vswprintf(CMyStringManager::ms_pwchBuffer, 
    int nWriteSize = vsprintf(pchBuffer, pchFormat, argList);

    if (nWriteSize >= 0)
    {
    // m_string = CMyStringManager::ms_pwchBuffer;
    m_string = pchBuffer;
    }

    delete []pchBuffer;
    pchBuffer = NULL;

    va_end(argList);
    }
    CMyString::operator const char* () const
    {
    return m_string.c_str();
    }测试代码如下:
    CMyString strFormat;
    CMyString str;
    str.m_string = "abc";
    strFormat.Format("%s%s", str, "def");assert(strFormat.m_string == "abcdef"); 哪位大虾 可以在不改动测试代码的前提下(其他随便改动,包括改stl源代码), 实现 
    strFormat == "abcdef"我一定奉送100分, 然后再发一个 空帖子, 再给100分十分感谢!!
      

  8.   

    修正: 上面的cpp文件实现如下:const int nMaxLen = 512;void CMyString::Format(const char* pchFormat, ...)
    {
    va_list argList;
    va_start(argList, pchFormat); char * pchBuffer = new char[nMaxLen];
    int nWriteSize = vsprintf(pchBuffer, pchFormat, argList);
    if (nWriteSize >= 0)
    {
    m_string = pchBuffer;
    }

    delete []pchBuffer;
    pchBuffer = NULL;

    va_end(argList);
    }
    CMyString::operator const char* () const
    {
    return m_string.c_str();
    }
      

  9.   

    你看看CString的format代码吧,我觉得实在要做,也不是不可能,但太不安全
    还是用c++的流操作吧
      

  10.   

    to:  ahao(天·狼·星星)c++的流操作 ?
    你是说 先把各种数据都 通过<< 输送到 某个缓冲区中,
    然后再得到格式化好的 字符串?可是我的对外的函数接口必须和 CString的Format一摸一样
    当然,内部实现 可以随便,
    但这样如何作呢?如何通过
    va_list argList;
    va_start(argList, pchFormat);
    等 来输入到某个缓冲区?谢谢
      

  11.   

    用<<是很方便的,比如
    int b=10;
    string c="C";
    CString d="D";
    ostringstream ostr;
    ostr << b << c << (LPCTSTR)d;
    得到的就是"10CD"你的实现虽然重定义了const char*,但似乎在作为参数列表传入时,编译器不会帮你调用做什么转换操作。大概看了一下不定参数的实现,参数列表好像直接用内存的偏移量去计算,你要实现传string,估计是很麻烦的。方法可能有三个,一个是在外部显式调用string的c_str(),二是放弃这个设计,使用c++的流,三是把CString的FormatV那个函数的实现复制过来,改一下,增加对string的处理,或许还需要加个类似%s的符号代表外部传的是string。
      

  12.   

    首先谢谢 ahao(天·狼·星星) 网友的回复现在我遇到的问题是, 公司要开发跨平台的产品,以前是基于 MFC的
    我负责写 一个跨平台的CMyString类, 这个类是供很多人使用的,
    我 没有权力 改变这个类的接口,尤其是这个广泛使用的Format,
    因为 大家都对MFC的CString 非常熟悉, 所有的代码都用的是 Format对于可能的三个方法:
    一. 要求外部调用c_str(), 可以考虑, 但增加了调用者的负担, 会被很多人埋怨的
    二. 还是我前面提到的问题,如果 不改变Format的函数原型,如果可以 用c++流来内部实现,当然是可以的, 但问题是 在Format内部, 只能得到 va_list argList; 这时候,如何使用流来实现呢?
    三. 我看了mfc的String的FormatV的实现, 不过就是先计算长度,然后调用 vsprintf 函数,
    我觉得mfc的CString可以这样写的原因在于 他内部只有一个 char*的成员变量,
    而 std的string内部有三个成员变量
      

  13.   

    不是阿,CString的FormatV函数,很复杂,里面对各种format标志都要做判断,再依次处理,你看一下把,太复杂了,对unicode和各种平台都要做相应处理。我看了也头大了。不过要求外部调用方式不变,即使改这个也不一定能实现你的要求。
      

  14.   

    to: ahao(天·狼·星星)  网友
    不好意思,公司 10:00 网络就断了, 所以...MFC CString的FormatV函数里面的东西是很多, 一个for 循环中很多判断
    但仔细一看,不过就是先计算一下 最终结果的长度而已.
    我给他分配 一个固定的,稍大的值 就可以不用这么复杂,关键是在最后的几句话, 其实还是使用vsprintf 来实现格式化的如果使用c++流来格式化, 
    一个问题是如何 得到 不定参数列表 中的各个参数
    另一个问题是 如何 解析例如 Format("%6.3f", 123456.7892); 的表达to:  demetry(智者橡木) 网友
    要是可以用mfc的CString, 谁还会自己再去搞一套了
    我作的这个CMyString 必须是跨平台的, 而且对外接口要和mfc的CString基本类似
      

  15.   

    的确,归根结底是由于sprintf之类的函数不支持string.
    不改外部调用方式要实现这个似乎很难
      

  16.   

    谢谢各位网友的 热情参与
    暂时就使用 调用c_str()来实现吧,有空我再仔细研究