使用场景
在得到字符串形式的C/C++代码时,有时会需要删除其中的注释。
C/C++删除字符串中的注释
- C/C++中的注释有两种
- // 行注释
- /**/ 段注释
代码实现
std::string deleteComment(std::string str) {
if (str.empty())
// 如果 str 为空
return str;
if (str.find("//") == str.npos &&
(str.find("/*") == str.npos || str.find("*/") == str.npos))
// 如果没有 // 注释 且没有/**/注释
return str;
int len = str.size();
for (int i = 0; i < len; ++i) {
// 如果先遇到 // 注释
if (str[i] == '/' && i + 1 < len && str[i + 1] == '/') {
int j = i;
while (j < len && str[j] != '\n') {
str[j] = ' ';
j++;
}
i = j;
}
// 如果遇到 /*注释
else if (str[i] == '/' && i + 1 < len && str[i + 1] == '*') {
str[i] = ' ';
str[i + 1] = ' ';
int j = i + 2;
while (j < len && j + 1 < len && !(str[j] == '*' && str[j + 1] == '/')) {
str[j] = ' ';
j++;
}
if (j < len && j + 1 < len) {
str[j] = ' ';
str[j + 1] = ' ';
}
i = j + 1;
}
// 如果遇到 ""
else if (str[i] == '"') {
int j = i + 1;
while (j < len && str[j] != '"') {
j++;
}
i = j;
}
}
return str;
}
算法思路
- 若字符串为空,直接return
- 若字符串中没有//或者没有/*或者没有/*,则直接return
- 遍历字符串
- 当遇到//时,继续遍历,直至找到\n
- 当遇到/*时,继续遍历,直至找到*/
- 当遇到“时,继续遍历,直至找到下一个”
算法效果
- 删除指定字符串中的行注释和段注释
- 自动跳过字符串中的字符串""
算法优化
没有开始做,但是读者可自己做
- 可以将代码中的while循环用string.find( )函数替代