我正在使用C ++编写一个类项目,我需要编写一个函数来获取代码中的注释并将它们插入到向量中。函数接收的文本文件是逐行拆分的,我正在考虑使用.find()
和.substr()
,但我不确定substr()
方法在这里是如何工作的我认为可行的
string comment = split.substr(0,split[i].find(inLineComment));
我不确定,(0,...)
是否会将字符串从开头拆分为评论字符?任何人都可以澄清吗?
我也不确定如何从块注释中获取注释代码,因为我只有.find(inLineComment)
用于内联注释字符。一些建议将不胜感激。
答案 0 :(得分:0)
假设您收到的函数存储在split
中,包含多行文本。 split[0]
是第一行,split[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()
返回输入子字符串的第一个字符,在这种情况下,它是第一个斜杠{{ 1}}。
多行注释有点复杂,因为我们只能识别标识符/
和/*
,并且我们看不到它们中的上下文有任何差异。
幸运的是,我们可以通过简单地使用变量*/
来跟踪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元素。然后停下来修剪那个部分。制作新字符串。 把它返还。您可以查看以下链接查看示例: