字符串處理-提取變量名

問題描述:輸入C語言變量定義語句,符合C語言語法要求,變量間可以有多個空格,包含數組,指針定義。

輸入: int x12, y=1,     num_stu=89, a[30], *p;

輸出:a,num_stu,p,x12,y

 

思路:關鍵是確定當前所處的狀態

state1: 處於變量名中

state2: 處於‘=’或‘[’ 到‘,’之間

state3: 處於‘,’到下一變量之間

處理每個字符前先確定當前的狀態,再按狀態來進行相應的處理。每次遇到空格或‘*' 可以直接跳過不影響結果。

 

#include <iostream>
#include <unordered_set>
#include <string>

using namespace std;


int main(){
    string definition= "int x12,  y=1, num_stu=89, a[30], *p;";
    int flag=0;
    //預處理,去掉開頭的變量類型和空格
    for(int i =0;i<definition.size();++i){
        if(definition[i]!=' '&&flag){definition=definition.substr(i);break;}
        if(definition[i]==' ')flag=1;//表示已經遇到過空格
    }
    flag=0;
    unordered_set<string> vSet;
    string temp="";
    for(int i=0;i<definition.size();++i){
        if(definition[i]==' '||definition[i]=='*')continue;
        //確定狀態
        if(definition[i]=='='||definition[i]=='['||(flag==1&&definition[i]!=','))flag=1;
        else if(definition[i]==','||definition[i]==';')flag=2;
        else flag=0;
        //按狀態來選擇處理方式
        switch(flag){
            case 0 :temp+=definition[i];break;
            case 1 :break;
            case 2 :vSet.insert(temp);temp="";
        }
    }

    for(auto e:vSet)cout<<e<<',';
    
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章