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)    收藏  举报

导航