在评论中用c ++拆分一行

时间:2017-04-13 19:39:33

标签: c++ string parsing

我正在使用C ++编写一个类项目,我需要编写一个函数来获取代码中的注释并将它们插入到向量中。函数接收的文本文件是逐行拆分的,我正在考虑使用.find().substr(),但我不确定substr()方法在这里是如何工作的我认为可行的

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

我不确定,(0,...)是否会将字符串从开头拆分为评论字符?任何人都可以澄清吗?

我也不确定如何从块注释中获取注释代码,因为我只有.find(inLineComment)用于内联注释字符。一些建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

假设您收到的函数存储在split中,包含多行文本。 split[0]是第一行,split[1]是第二行,依此类推。

首先,您的问题可以分为两部分:

1。抓住单行评论

要获取单行注释,请使用双相邻斜杠//标识注释部分。你可以解析f​​or循环中的每一行, 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()返回输入子字符串的第一个字符,在这种情况下,它是第一个斜杠{{ 1}}。

2。抓住多行评论

多行注释有点复杂,因为我们只能识别标识符//*,并且我们看不到它们中的上下文有任何差异。

幸运的是,我们可以通过简单地使用变量*/来跟踪bool inComment/*来解决这个问题:当我们遇到*/时,我们会设置{{1}标志;看到/*后,我们将标志设置为关闭。

但问题是,一行中可能有多个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,它控制两个if else块之间的执行流程。

答案 1 :(得分:-1)

这是函数签名:

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

意思是,取字符串并从pos'元素开始。 并通过len元素。然后停下来修剪那个部分。制作新字符串。 把它返还。您可以查看以下链接查看示例:

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