2012-08-10 44 views
1

我想解析來自服務器的網絡數據,並且我試圖找到我所擁有的更多stl版本。C++轉義短語子字符串

我的舊代碼由for()循環組成,並檢查字符串的每個字符與一組轉義字符,並使用stringstream收集其餘字符。正如我可以想象的那樣,這種循環在讀取Web數據時導致高級失敗,因爲我需要嚴格的語法檢查。

我想改爲開始使用字符串::查找和字符串:: substr函數,但我不確定最好的實現。

基本上,我想從服務器讀取一串數據,不同的數據,用逗號分隔。 (即首先姓氏,電子郵件@ email.com),然後用逗號分隔它,但讀取它們之間的數據。

任何人都可以提供任何建議嗎?

+1

你應該看看正則表達式 - 他們會讓你定義一套好的規則來檢索特定的模式。 – Pyrce 2012-08-10 18:49:47

+1

Boost庫有一些非常漂亮的東西,比如'boost :: split'和'boost :: regex',你可能會覺得很有用。一些編譯器也支持新的C++ 11'std :: regex'等。如果您正在處理XML soap請求和響應,則TinyXML或其他XML解析器可能會幫助您。 – AJG85 2012-08-10 19:30:27

回答

0

我不確定你解析哪種數據,但使用多層體系結構總是一個好主意。每個圖層都應該實現一個抽象函數,並且每個圖層只應該執行一項工作(如轉義字符)。

您使用的層數取決於到流

你的問題,我建議以下層解碼所需的實際步驟:

1:令牌化的「」和‘\ n’的轉換成某種字符串

第二的載體:解決逃跑:解碼逃生characers

你應該使用std :: stringstream的,並用循環處理的字符。除非你的格式非常簡單(就像只有一個分隔符,沒有轉義符),你不能真的使用任何標準函數。

+0

這是我現在做的更多。我正在使用strtok_s(VC++版本)將數據轉換爲地圖。我檢查轉義字符的數量作爲第一級語法檢查。然後,我將解析的數據傳遞給更高級別的函數來解釋和使用它。 – 2012-08-11 05:44:04

0

對於學習體驗,這是我最終用來解析數據到地圖中的代碼。您可以使用web_parse_resurn.err查看是否有錯誤,或將其用於特定的錯誤代碼。

struct web_parse_return { 
map<int,string> parsedata; 
int err; 
}; 

web_parse_return* parsewebstring(char* escapechar, char* input, int tokenminimum) {     
int err = 0; 
map<int,string> datamap; 
if(input == "MISSING_INFO") { //a server-side string for data left out in the call 
    err++; 
} 
else { 
    char* nTOKEN; 
    char* TOKEN = strtok_s(input, escapechar,&nTOKEN); 
    if(TOKEN != 0) { //if the escape character is found 
     int tokencount = 0; 
     while(TOKEN != 0) {//since it finds the next occurrence, keep going 
      datamap.insert(pair<int,string>(tokencount,TOKEN)); 
      TOKEN = strtok_s(NULL, escapechar,&nTOKEN); 
      tokencount++; 
     } 
     if(tokencount < tokenminimum) //check that the right number was hit 
      err++; //other wise, up the error count 
    } 
    else { 
     err++; 
    } 
} 

web_parse_return* p = new web_parse_return; //initializing a new struct 
p->err = err; 
p->parsedata = datamap; 
return p; 
}