string自建常用函式(4)
搭配另一個處理數字的函式:檢查中間的字元是否都為數字
bool IsDigitRange(string::size_type stStart, string::size_type stEnd, string Str)
{
bool bFound = true;
for(string::size_type i = stStart + 1; i < stEnd; ++i)
{
if(isdigit(Str[i]) == 0)
bFound = false;
}
return bFound;
}
bool Format(string& strSrc, const char* poFormat,
)
{
// 參數一 strSrc
// 參數二 poFormat
// 參數三 (char *)((&poFormat)+1)
// 

strSrc.clear();
string strFormat(poFormat);
string strTotalElement;
string::size_type stSize = strFormat.length();
//va_list poccElement = (char *)((&poFormat)+1);
int arg_int = 1;
double arg_double = 1;
string arg_str;
char arg_char = 0;
// 分析格式
int iCount = 0;
vector <string> VstrFormat;
vector <string> VstrToken;
string::size_type stPos = 0, stPos2 = 0, stEndPos = string::npos;
string tmpstrFormat(strFormat);
while(true)
{
stPos = tmpstrFormat.find("%");
if(stPos == string::npos)
{
if(!tmpstrFormat.empty())
{
string tmpstr = tmpstrFormat;
VstrFormat.push_back(tmpstr);
}
break;
}
// 將%xxd存入
string tmpstr2;
bool bFound = true;
string::size_type stEndPos1 = 0, stEndPos2 = 0, stEndPos3 = 0, stEndPos4 = 0;
if((stEndPos1 = tmpstrFormat.find("d", stPos)) != string::npos)
{
bFound = IsDigitRange(stPos, stEndPos1, tmpstrFormat);
}
if((stEndPos2 = tmpstrFormat.find("f", stPos)) != string::npos)
{
bFound = true;
}
if((stEndPos3 = tmpstrFormat.find("s", stPos)) != string::npos)
{
bFound = true;
}
if((stEndPos4 = tmpstrFormat.find("c", stPos)) != string::npos)
{
bFound = true;
}
if(stEndPos1 != string::npos || stEndPos2 != string::npos || stEndPos3 != string::npos || stEndPos4 != string::npos)
{
if(stEndPos1 != string::npos)
stEndPos = min(stEndPos, stEndPos1);
if(stEndPos2 != string::npos)
stEndPos = min(stEndPos, stEndPos2);
if(stEndPos3 != string::npos)
stEndPos = min(stEndPos, stEndPos3);
if(stEndPos4 != string::npos)
stEndPos = min(stEndPos, stEndPos4);
}
else
bFound = false;
if(bFound)
tmpstr2 = tmpstrFormat.substr(stPos, stEndPos - stPos + 1);
else
return false;
VstrToken.push_back(tmpstr2);
// 將文字存入
string tmpstr = tmpstrFormat.substr(0, stEndPos + 1);
VstrFormat.push_back(tmpstr);
tmpstrFormat.erase(0, stEndPos + 1);
++iCount;
stEndPos = string::npos;
}
// 計算需要多少空間
va_list poccElement;
va_start(poccElement, poFormat);
int itmpCount = iCount;
char szBuf[MAX_PATH];
vector <string>::iterator IterToken = VstrToken.begin();
while(itmpCount != 0)
{
if((stPos = (*IterToken).find("d")) != string::npos)
{
arg_int = va_arg(poccElement, int);
sprintf(szBuf, (*IterToken).c_str(), arg_int);
}
else if((stPos = (*IterToken).find("s")) != string::npos)
{
arg_str = va_arg(poccElement, char*);
sprintf(szBuf, (*IterToken).c_str(), arg_str.c_str());
}
else if((stPos = (*IterToken).find("f")) != string::npos)
{
arg_double = va_arg(poccElement, double);
sprintf(szBuf, (*IterToken).c_str(), arg_double);
}
else if((stPos = (*IterToken).find("c")) != string::npos)
{
arg_char = va_arg(poccElement, char);
sprintf(szBuf, (*IterToken).c_str(), arg_char);
}
else
{
strncpy(szBuf, (*IterToken).c_str(), MAX_PATH);
}
string strElement(szBuf);
stSize += strElement.length();
if(itmpCount != 1)
strTotalElement += strElement + ", ";
else
strTotalElement += strElement;
--itmpCount;
++IterToken;
}
va_end(poccElement);

// 將參數存入並組合
char* poBuf = new char[stSize];
va_start(poccElement, poFormat);
vector <string>::iterator Iter;
IterToken = VstrToken.begin();
for(Iter = VstrFormat.begin(); Iter != VstrFormat.end(); ++Iter)
{
if(IterToken != VstrToken.end() && (stPos = (*IterToken).find("d")) != string::npos)
{
arg_int = va_arg(poccElement, int);
sprintf(poBuf, (*Iter).c_str(), arg_int);
}
else if(IterToken != VstrToken.end() && (stPos = (*IterToken).find("s")) != string::npos)
{
arg_str = va_arg(poccElement, char*);
sprintf(poBuf, (*Iter).c_str(), arg_str.c_str());
}
else if(IterToken != VstrToken.end() && (stPos = (*IterToken).find("f")) != string::npos)
{
arg_double = va_arg(poccElement, double);
sprintf(poBuf, (*Iter).c_str(), arg_double);
}
else if(IterToken != VstrToken.end() && (stPos = (*IterToken).find("c")) != string::npos)
{
arg_char = va_arg(poccElement, char);
sprintf(poBuf, (*Iter).c_str(), arg_char);
}
else
{
strncpy(poBuf, (*Iter).c_str(), stSize);
}
strSrc += poBuf;
++IterToken;
}
va_end(poccElement);
delete []poBuf;
return true;
}
用法舉例:
string tmpstr;
Format(tmpstr, "那邊有%d個%s!", 5, "蘋果");
// tmpstr = 那邊有5個蘋果!
posted on 2008-10-29 19:42 LancetChang 阅读(152) 评论(0) 收藏 举报

浙公网安备 33010602011771号