从C++解析的字符串中提取数字

比如“ID=1,VALUE=3”,首先判断下是前面的字母是什么,然后读取数值。

这个格式是不是定的?

如果是定的那么容易点,普通的解析方法就是把字符串按逗号分成两串,然后分别把两串按等号再分,分别就有

s[0]="id"

S[1]="1"

S[2]="value"

s[3]="3"

这样就可以了。

只有你的字符串有规则,一般都能解析的,如果规则复杂那么就需要建立一个解析器了。我下面这个是解析xml查找串的,给你参考参考,就是解析类似这样的字符串/root/node[a='1']/node1[a="5"]

#pragma once

// CXMLFindor 命令目标

class CXMLFindor : public CObject
{
private :
    typedef struct Link_s
    {
        char m_sNode[256+1];
        char m_sAttr[256+1];
        char m_sAttrValue[256+1];
        struct Link_s *Next;
    }LINK_S,*PTR_LINK_S;
    PTR_LINK_S m_LinkHand;
public:
    CXMLFindor();
    virtual ~CXMLFindor();
private:
    int Parse(char* sPath);
    int IsAttributeFound(TiXmlAttribute *pAttr,PTR_LINK_S p);
public:
    void ClearLink(void);
public:
    CString GetValue(TiXmlDocument * xmlDoc,char *sPath);

};

// XMLFindor.cpp : 实现文件
//

#include "stdafx.h"
#include "btpchk.h"
#include "XMLFindor.h"
#include "tinystr.h"
#include "tinyxml.h"


// CXMLFindor

CXMLFindor::CXMLFindor()
:m_LinkHand(NULL)
{
}

CXMLFindor::~CXMLFindor()
{
    ClearLink();
}


// CXMLFindor 成员函数

int CXMLFindor::Parse(char* sPath)
{
/*
状态变换图:
   /      a    R(a)  [      a   R(a)  =
S ---> 1 --->   2  ----> 3 --->  4  ----> 5 ------+
                E                         | "     | '
       A                                  V       V
       |                                  6       10
       |                                  | b     | b
       |                                  V       V
       |                                  7 R(b)  11 R(b)
       |                                  | "     | '
       |           /                   ]  V       |
       +------------------------  9 <---- 8 <-----+
                                  E
注: A上箭头  >右箭头   <左箭头   V下箭头  R(b)循环输入b 
    数字为状态  S起始状态  E可以结束的状态

*/
    PTR_LINK_S LP = NULL;
    int iState=0;
    int iError= -1;
    int iStop = 0;
    char *p = sPath;
    char sTemp[256+1];
    int  iTemp = 0;
    memset(sTemp,0x00,sizeof(sTemp));
    while(*p != 0x00)
    {
        switch(iState)
        {
        case 0:            //初始状态
            if(*p != '/')
            {
                iError = p - sPath;
            }
            else
            {
                iState = 1;
                iStop = 0;
            }
            break;
        case 1:            //
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
            {
                sTemp[iTemp++] = *p;
                iState = 2;
                iStop = 1;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 2:
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
            {
                sTemp[iTemp++] = *p;
                iState = 2;
                iStop = 1;
            }
            else if(*p == '/')
            {
                PTR_LINK_S newLP = new LINK_S();
                sprintf_s(newLP->m_sNode,256,"%s",sTemp);
                sprintf_s(newLP->m_sAttr,256,"%s","");
                sprintf_s(newLP->m_sAttrValue,256,"%s","");
                newLP->Next=NULL;
                if( m_LinkHand == NULL)
                {
                    m_LinkHand = newLP;
                    LP = newLP;
                }
                else
                {
                    LP->Next = newLP;
                    LP = newLP;
                }
                TRACE("Node = [%s]\n",sTemp);
                iTemp = 0;
                memset(sTemp , 0x00, sizeof(sTemp));
                iState = 1;
                iStop = 0;
            }
            else if(*p == '[')
            {
                PTR_LINK_S newLP = new LINK_S();
                sprintf_s(newLP->m_sNode,256,"%s",sTemp);
                sprintf_s(newLP->m_sAttr,256,"%s","");
                sprintf_s(newLP->m_sAttrValue,256,"%s","");
                newLP->Next=NULL;
                if( m_LinkHand == NULL)
                {
                    m_LinkHand = newLP;
                    LP = newLP;
                }
                else
                {
                    LP->Next = newLP;
                    LP = newLP;
                }
                TRACE("Node = [%s]\n",sTemp);
                iTemp = 0;
                memset(sTemp , 0x00, sizeof(sTemp));
                iState = 3;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 3:
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
            {
                sTemp[iTemp++] = *p;
                iState = 4;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 4:
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
            {
                sTemp[iTemp++] = *p;
                iState = 4;
                iStop = 0;
            }
            else if(*p == '=')
            {
                sprintf_s(LP->m_sAttr,256,"%s",sTemp);
                TRACE("Attr = [%s]\n",sTemp);
                iTemp = 0;
                memset(sTemp , 0x00, sizeof(sTemp));
                iState = 5;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 5:
            if(*p == '\"')
            {
                iState = 6;
                iStop = 0;
            }
            else if(*p == '\'')
            {
                iState = 10;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 6:
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
            {
                sTemp[iTemp++] = *p;
                iState = 7;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 7:
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
            {
                sTemp[iTemp++] = *p;
                iState = 7;
                iStop = 0;
            }
            else if(*p == '\"')
            {
                sprintf_s(LP->m_sAttrValue,256,"%s",sTemp);
                TRACE("AttrValue = [%s]\n",sTemp);
                iTemp = 0;
                memset(sTemp , 0x00, sizeof(sTemp));
                iState = 8;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 8:
            if(*p == ']')
            {
                iState = 9;
                iStop = 2;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 9:
            if(*p == '/')
            {
                iState = 1;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 10:
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
            {
                sTemp[iTemp++] = *p;
                iState = 11;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        case 11:
            if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
            {
                sTemp[iTemp++] = *p;
                iState = 11;
                iStop = 0;
            }
            else if(*p == '\'')
            {
                sprintf_s(LP->m_sAttrValue,256,"%s",sTemp);
                TRACE("AttrValue = [%s]\n",sTemp);
                iTemp = 0;
                memset(sTemp , 0x00, sizeof(sTemp));
                iState = 8;
                iStop = 0;
            }
            else
            {
                iError = p - sPath;
            }
            break;
        }
        if(iError != -1)
        {
            break;
        }
        p++;
    }
    if(iState == 2)
    {
        PTR_LINK_S newLP = new LINK_S();
        sprintf_s(newLP->m_sNode,256,"%s",sTemp);
        sprintf_s(newLP->m_sAttr,256,"%s","");
        sprintf_s(newLP->m_sAttrValue,256,"%s","");
        newLP->Next=NULL;
        if( m_LinkHand == NULL)
        {
            m_LinkHand = newLP;
            LP = newLP;
        }
        else
        {
            LP->Next = newLP;
            LP = newLP;
        }
        TRACE("Node = [%s]\n",sTemp);
        iTemp = 0;
        memset(sTemp , 0x00, sizeof(sTemp));
    }
    TRACE("iError = [%d]\n",iError);

    if(iError != -1)
    {
        ClearLink();
        return iError + 1;
    }
    else
    {
        if(iStop == 0 )
        {
            ClearLink();
            return -1;
        }
        else
        {
            return 0;
        }
    }
}

void CXMLFindor::ClearLink(void)
{
    PTR_LINK_S p = this->m_LinkHand;
    while(p!=NULL)
    {
        PTR_LINK_S dp = p;
        p=p->Next;
        delete dp;
    }
}
int  CXMLFindor::IsAttributeFound(TiXmlAttribute *pAttr,PTR_LINK_S p)
{
    int iFound = -1;
    if(strlen(p->m_sAttr) == 0)  //无属性检查
        return 0;
    
    while(pAttr != NULL)
    {
        if(strcmp(p->m_sAttr, pAttr->Name() ) == 0 && 
            strcmp(pAttr->Value(),p->m_sAttrValue) != 0)
        {
            iFound = 0;
            break;
        }
        pAttr = pAttr->Next();
    }
    return iFound;
}
int CXMLFindor::GetValue(TiXmlDocument * xmlDoc,char *sPath)
{
    int iRtn ;
    iRtn = this->Parse(sPath);
    if(iRtn != 0)
    {
        return iRtn;
    }
    PTR_LINK_S p = this->m_LinkHand;
    TiXmlElement *pXml = NULL;
    while(p != NULL)
    {
        TiXmlElement *pXml = xmlDoc->FirstChildElement(p->m_sNode);
        //xmlDoc->
        if(pXml == NULL) //路径错误
        {
            return -2;
        }
        else
        {
            while(pXml != NULL)
            {
                if(IsAttributeFound(pXml->FirstAttribute(),p) == 0)
                {
                    break;
                }
            }

        }
        p=p->Next;
    }
    this->ClearLink();
}

追问

用等号分割的时候用什么函数呢??可以具体说下么 谢谢~

追答

可以自己写函数,也可以用现成的,但要看你是居于什么的程序
mfc结构的就用字符串的split就可以了
普通c语言的用strstr,
你可以百度一下

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-08-12

可以这么写,比较简单

int t,x=0;
scanf("%s",s+1);
for(int i=1;i<=strlen(s+1);i++)
    if(s[i]>='0'&&s[i]<='9')
    {
        t=i;
        break;
     }
 for(int i=t;i<=strlen(s+1);i++)
     x=x*10+s[i]-48;
 
 结果为t

第2个回答  2017-07-06
你字符串有什么规律啊 可以用MID来截取
相似回答