2013-06-19 22 views
2

有人可以給我一些提示什麼是從可變長度輸入字符串中提取參數名稱和參數值的最佳/優雅方法?我需要提取這些值才能將它們寫入另一個.txt文件。我應該使用正則表達式嗎?什麼是使用它們的方式?解析字符串給出:#parameter1〜value1#parameter2〜value2#parameter3

我知道如何做到這一點,但使用循環和各種if-then條件,這是一團糟。我需要的是在哪裏尋找可以幫助我的一些內置函數。

謝謝!

+0

使用兩個分裂的一個#和一個〜每個結果 –

回答

1

正則表達式在這種情況下是不必要的開銷。一個字符std::string::find就足以完成這項工作。假設每個參數(甚至是第一)開始#,該值是可選的(默認爲"")和後#總是忽略你可以做一些事情如:

std::string pstr = ...; // the parameter string 

typedef std::pair<std::string, std::string> Param; 
std::vector<Param> params; 

std::size_t pos = pstr.find('#'); 
std::size_t next = pstr.find('#', pos); 

while (pos != std::string::npos) { 
    std::string param, value; 

    std::size_t sep_pos = pstr.find('~', next); 
    if (sep_pos != std::string::npos) { 
     value = pstr.substr(sep_pos + 1, next - sep_pos - 1); 
     param = pstr.substr(pos + 1, sep_pos - pos - 1); 
    } else { 
     param = pstr.substr(pos + 1, next - pos - 1); 
    } 
    params.push_back(Param(param, value)); 
} 

注意,這std::strtok是一個糟糕的建議。該函數是不安全的,不應該在正常的C++代碼中使用。

+0

@ jons34yp ..你可以詳細說明爲什麼我們不能使用'strtok' ... – nitish712

+0

謝謝jons34yp你的答案。它確實幫助我解決了我的問題。乾杯! – Krcevina

+0

@ nitish712:它是不可重入的(即不能在多線程程序中使用)並修改給定的字符串(即不能與const限定的數據一起使用)。 – 2013-06-20 13:19:04

0

假設所存儲的初始文本如下:

param1:value1;param2:value2;param3:value3..... 

最好的辦法是使用javaStringTokenizer。 的代碼如下:

StringTokenizer sT=new StringTokenizer(InputString, ";"); 
while(sT.hasMoreTokens()) 
{ 
    String Pair=sT.nextToken(); 
    String sT2=new StringTokenizer(Pair, ":"); 
    String param=sT2.nextToken(); 
    String value=sT2.nextToken(); 
    System.out.println(param+" "+value); 
} 

在另一方面,如果,你想在C++嚴格代碼,那麼你可以使用C++計數器部分, strtok功能。欲瞭解更多信息請見here

相關問題