假設什麼收到你的函數存儲在split
,與多行文本。第一行是split[0]
,第二行是split[1]
,依此類推。
首先,你的問題可以分爲兩個部分:
1.抓住單行註釋
搶單行註釋,標識與雙斜線相鄰的//
註釋部分。你可以通過for循環中的每一行解析, for(int i=0; i<split.size(); i++)
。和循環內,檢查各行,如果它包含標識//
:
int pos = split[i].find("//");
if (pos != string::npos)
string comment = split[i].substr(pos+2);
對於您的信息,string::npos
是價值find()
函數返回,如果沒有找到關鍵字。 (見cpp reference)
我substr()
功能把+2的原因是因爲find()
返回輸入字符串的第一個字符,在這種情況下,它是第一個斜槓/
。
2.抓住多行註釋
多行註釋是有點複雜,因爲我們只能識別標識/*
和*/
,我們不能看到兩個內的情況下有什麼區別其中。
幸運的是,我們可以通過簡單地利用可變跟蹤/*
和*/
解決這個問題:當我們遇到/*
,我們再設置inComment
標誌的;在看到*/
後,我們將標誌設置爲關閉。
但問題是,在一行中可能會有多個/*
和*/
!所以我們需要遞歸提取內容:找到/*
後,我們搜索*/
。如果我們發現它在同一行中,則我們將搜索範圍向後移動,然後再次搜索/*
,依此類推。這可以通過一個while循環來實現。下面的代碼:我存儲在整條生產線的臨時串
string sub = split[i];
if (! inComment){
int start, end;
while ((start=sub.find("/*")) != string::npos){
sub = sub.substr(start+2); // move backward
int end = sub.find("*/");
if (end != string::npos){
comment = sub.substr(0, end);
sub = sub.substr(end+2); // move backward
// inComment remains false
}else {
comment = sub;
inComment = true;
break;
}
}
}else {
int start;
int end = sub.find("*/");
if (end != string::npos){
comment = sub.substr(0, end);
sub = sub.substr(end+2); // move backward
inComment = false;
while ((start=sub.find("/*")) != string::npos){
sub = sub.substr(start+2); // move backward
end = sub.find("*/");
if (end != string::npos){
comment = sub.substr(0, end);
sub = sub.substr(end+2); // move backward
// inComment remains false
}else {
comment = sub;
inComment = true;
break;
}
}
}
}
注意在開始的時候叫sub
。在提取每條評論之後,更新了sub
的範圍,以便下一個find()
函數可以遞歸地進行搜索。
這段代碼的關鍵角色是變量inComment
,它控制兩個if else塊之間的執行流程。
'cppreference.com'非常適合尋找這些類型問題的答案。它記錄了所有的標準庫。這裏是['std :: string :: substr'](http://en.cppreference.com/w/cpp/string/basic_string/substr)上的頁面,這裏是['std :: string: :find'](http://en.cppreference.com/w/cpp/string/basic_string/find)。 –
添加相同的文字和一些評論 –