2017-04-13 408 views
-1

我正在使用C++編寫一個類項目,我需要編寫一個函數來獲取代碼中的註釋並將它們插入到一個向量中。函數接收到的文本文件是逐行分割的,我正在考慮使用.find().substr(),但我不確定substr()方法在這裏的工作方式是我認爲會起作用的。在C++中分割線的註釋

string comment = split.substr(0,split[i].find(inLineComment)); 

雖然我不確定,(0,...)是否會將字符串從開頭分割爲註釋字符?任何人都可以澄清?

我也不確定如何從塊註釋中獲得註釋代碼,因爲我只有嵌入註釋字符.find(inLineComment)。一些建議,將不勝感激。

+1

'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)。 –

+0

添加相同的文字和一些評論 –

回答

-1

這是函數簽名:

string substr (size_t pos = 0, size_t len = npos) const; 

含義是,採用串,並在POS'元素開始。 並傳遞len元素。然後停止並修剪那部分。製作新的字符串。 退貨。您可以查看下面的鏈接,看看這個例子:

http://www.cplusplus.com/reference/string/string/substr/

0

假設什麼收到你的函數存儲在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塊之間的執行流程。