例如: 
在支持Unicode下: 
CString str,str1,str2; 
str1=_T("aaaaa"); 
str2=_T("bbbbb"); 
str.Format(_T("%S--%s")),str1,str2); 
MessageBox(str); 
则其输出结果是:a--bbbbb 我这样解决输出问题: 
str.Format(str1+"--"+str2); 
或者str=str1+"--"+str2; 但我就是想不通str.Format(_T("%S--%s")),str1,str2);这为什么会出问题噻,老手说说该怎么解决这个格式化问题 5555555没分了

解决方案 »

  1.   

    看了实现你应该就明白了
    void CString::FormatV(LPCTSTR lpszFormat, va_list argList)
    {
    ASSERT(AfxIsValidString(lpszFormat)); va_list argListSave = argList; // make a guess at the maximum length of the resulting string
    int nMaxLen = 0;
    for (LPCTSTR lpsz = lpszFormat; *lpsz != '\0'; lpsz = _tcsinc(lpsz))
    {
    // handle '%' character, but watch out for '%%'
    if (*lpsz != '%' || *(lpsz = _tcsinc(lpsz)) == '%')
    {
    nMaxLen += _tclen(lpsz);
    continue;
    } int nItemLen = 0; // handle '%' character with format
    int nWidth = 0;
    for (; *lpsz != '\0'; lpsz = _tcsinc(lpsz))
    {
    // check for valid flags
    if (*lpsz == '#')
    nMaxLen += 2;   // for '0x'
    else if (*lpsz == '*')
    nWidth = va_arg(argList, int);
    else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||
    *lpsz == ' ')
    ;
    else // hit non-flag character
    break;
    }
    // get width and skip it
    if (nWidth == 0)
    {
    // width indicated by
    nWidth = _ttoi(lpsz);
    for (; *lpsz != '\0' && _istdigit(*lpsz); lpsz = _tcsinc(lpsz))
    ;
    }
    ASSERT(nWidth >= 0); int nPrecision = 0;
    if (*lpsz == '.')
    {
    // skip past '.' separator (width.precision)
    lpsz = _tcsinc(lpsz); // get precision and skip it
    if (*lpsz == '*')
    {
    nPrecision = va_arg(argList, int);
    lpsz = _tcsinc(lpsz);
    }
    else
    {
    nPrecision = _ttoi(lpsz);
    for (; *lpsz != '\0' && _istdigit(*lpsz); lpsz = _tcsinc(lpsz))
    ;
    }
    ASSERT(nPrecision >= 0);
    } // should be on type modifier or specifier
    int nModifier = 0;
    if (_tcsncmp(lpsz, _T("I64"), 3) == 0)
    {
    lpsz += 3;
    nModifier = FORCE_INT64;
    #if !defined(_X86_) && !defined(_ALPHA_)
    // __int64 is only available on X86 and ALPHA platforms
    ASSERT(FALSE);
    #endif
    }
    else
    {
    switch (*lpsz)
    {
    // modifiers that affect size
    case 'h':
    nModifier = FORCE_ANSI;
    lpsz = _tcsinc(lpsz);
    break;
    case 'l':
    nModifier = FORCE_UNICODE;
    lpsz = _tcsinc(lpsz);
    break; // modifiers that do not affect size
    case 'F':
    case 'N':
    case 'L':
    lpsz = _tcsinc(lpsz);
    break;
    }
    } // now should be on specifier
    switch (*lpsz | nModifier)
    {
    // single characters
    case 'c':
    case 'C':
    nItemLen = 2;
    va_arg(argList, TCHAR_ARG);
    break;
    case 'c'|FORCE_ANSI:
    case 'C'|FORCE_ANSI:
    nItemLen = 2;
    va_arg(argList, CHAR_ARG);
    break;
    case 'c'|FORCE_UNICODE:
    case 'C'|FORCE_UNICODE:
    nItemLen = 2;
    va_arg(argList, WCHAR_ARG);
    break; // strings
    case 's':
    {
    LPCTSTR pstrNextArg = va_arg(argList, LPCTSTR);
    if (pstrNextArg == NULL)
       nItemLen = 6;  // "(null)"
    else
    {
       nItemLen = lstrlen(pstrNextArg);
       nItemLen = max(1, nItemLen);
    }
    }
    break; case 'S':
    {
    #ifndef _UNICODE
    LPWSTR pstrNextArg = va_arg(argList, LPWSTR);
    if (pstrNextArg == NULL)
       nItemLen = 6;  // "(null)"
    else
    {
       nItemLen = wcslen(pstrNextArg);
       nItemLen = max(1, nItemLen);
    }
    #else
    LPCSTR pstrNextArg = va_arg(argList, LPCSTR);
    if (pstrNextArg == NULL)
       nItemLen = 6; // "(null)"
    else
    {
       nItemLen = lstrlenA(pstrNextArg);
       nItemLen = max(1, nItemLen);
    }
    #endif
    }
    break; case 's'|FORCE_ANSI:
    case 'S'|FORCE_ANSI:
    {
    LPCSTR pstrNextArg = va_arg(argList, LPCSTR);
    if (pstrNextArg == NULL)
       nItemLen = 6; // "(null)"
    else
    {
       nItemLen = lstrlenA(pstrNextArg);
       nItemLen = max(1, nItemLen);
    }
    }
    break; case 's'|FORCE_UNICODE:
    case 'S'|FORCE_UNICODE:
    {
    LPWSTR pstrNextArg = va_arg(argList, LPWSTR);
    if (pstrNextArg == NULL)
       nItemLen = 6; // "(null)"
    else
    {
       nItemLen = wcslen(pstrNextArg);
       nItemLen = max(1, nItemLen);
    }
    }
    break;
    } // adjust nItemLen for strings
    if (nItemLen != 0)
    {
    if (nPrecision != 0)
    nItemLen = min(nItemLen, nPrecision);
    nItemLen = max(nItemLen, nWidth);
    }
    else
    {
    switch (*lpsz)
    {
    // integers
    case 'd':
    case 'i':
    case 'u':
    case 'x':
    case 'X':
    case 'o':
    if (nModifier & FORCE_INT64)
    va_arg(argList, __int64);
    else
    va_arg(argList, int);
    nItemLen = 32;
    nItemLen = max(nItemLen, nWidth+nPrecision);
    break; case 'e':
    case 'g':
    case 'G':
    va_arg(argList, DOUBLE_ARG);
    nItemLen = 128;
    nItemLen = max(nItemLen, nWidth+nPrecision);
    break; case 'f':
    va_arg(argList, DOUBLE_ARG);
    nItemLen = 128; // width isn't truncated
    // 312 == strlen("-1+(309 zeroes).")
    // 309 zeroes == max precision of a double
    nItemLen = max(nItemLen, 312+nPrecision);
    break; case 'p':
    va_arg(argList, void*);
    nItemLen = 32;
    nItemLen = max(nItemLen, nWidth+nPrecision);
    break; // no output
    case 'n':
    va_arg(argList, int*);
    break; default:
    ASSERT(FALSE);  // unknown formatting option
    }
    } // adjust nMaxLen for output nItemLen
    nMaxLen += nItemLen;
    } GetBuffer(nMaxLen);
    VERIFY(_vstprintf(m_pchData, lpszFormat, argListSave) <= GetAllocLength());
    ReleaseBuffer(); va_end(argListSave);
    }
      

  2.   

    str.Format(_T("%s--%s"),str1,str2);
    多了个 “)”
      

  3.   

    str.Format(_T("%S--%s")),str1,str2); 
    大S在unicode工程下,后面的参数作为ansi看待
    你str1=_T("aaaaa");在内存中就是0x61 0x00 0x61 0x00 0x061 0x00 0x61 0x00 0x61 0x00 0x00 0x00
    而ansi字符串遇到0x00就认为字符串结束,所以你只能得到一个0x61也就是一个a