0

I'm using getline() to open a .cpp file.

getline(theFile, fileData);

I'm wondering if there is any way to have getline() avoid grabbing c++ comments (/*, */ and //)?

So far, trying something like this doesn't quite work.

if (fileData[i] == '/*')
4

3 回答 3

4

我认为阅读评论对您来说是不可避免的,但是您可以通过一次阅读一个字符的文件来处理它们。

为此,您可以将文件加载到字符串中并构建具有以下状态的状态机:

  1. 这是实际代码
  2. 前一个字符是/
  3. 前一个字符是*
  4. 我是单行评论
  5. 我是多行评论

状态机从状态 1开始

如果机器处于状态 1并击中一个/字符,则转换到状态 2

如果机器处于状态 2并击中一个/字符,则转换到状态 4。否则,转换到状态 1

如果机器处于状态 2并击中一个*字符,则转换到状态 5。否则,转换到状态 1

如果机器处于状态 4并遇到换行符,则转换到状态 1

如果机器处于状态 5并击中一个*字符,则转换到状态 3

如果机器处于状态 3并命中一个/字符,则转换到状态 1(多行注释结束)。否则,转换到状态 5

如果标记机器进入和退出注释状态的字符位置,则可以从字符串中去除这些字符。

或者,您可以探索正则表达式,它提供了非常简洁地描述这种状态机的方法。

于 2013-10-07T22:22:45.263 回答
3

所以,一个问题是if(fileData[i] == '/*')测试是否char fileData[i]等于'/*'...不是a char

要查找一行是否包含注释,您可能需要查看以下内容之一:

对于多行注释,您可能想要存储诸如存储标志之类的东西,该标志指示上一行的状态是否为“注释中”,然后搜索/**/根据该标志,随时更新它。

于 2013-10-07T22:11:34.313 回答
0

单引号表示 a char,而char数据类型表示一个 SINGLE char.'/*' 没有意义,因为它的两个charwhilefileData[i]指的是一个单char

你的if陈述需要更加有力。

于 2013-10-07T22:10:51.463 回答