【问题标题】:Avoiding Comments w/ C++ getline()使用 C++ getline() 避免注释
【发布时间】:2013-10-14 15:56:32
【问题描述】:

我正在使用 getline() 打开一个 .cpp 文件。

getline(theFile, fileData);

我想知道是否有任何方法可以让 getline() 避免抓取 c++ cmets(/*, *///)?

到目前为止,尝试这样的事情并不完全奏效。

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

【问题讨论】:

  • 我猜'/*'不是一个字符
  • 请注意,'/* */' cmets 可以跨越多行,因此单行解决方案在这里是不够的。
  • 使用那个字符串,你的程序会被它自己的源代码阻塞。
  • 我会选择 c++11 正则表达式,你可以用几行轻松地制作一个简单的解析器。

标签: c++


【解决方案1】:

单引号表示charchar 数据类型表示 SINGLE char.'/*' 没有意义,因为它是两个charfileData[i] 指的是单个@ 987654326@.

您的if 语句需要更加健壮。

【讨论】:

    【解决方案2】:

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

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

    对于多行 cmets,您可能想要存储一些东西,例如存储一个标志,指示上一行的状态是否为“评论中”,然后根据搜索 /**/该标志,随时更新。

    【讨论】:

      【解决方案3】:

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

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

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

      状态机从状态1

      开始

      如果机器处于状态 1 并遇到 / 字符,则转换到 状态 2

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

      如果机器处于 State 2 并遇到* 字符,则转换到 State 5。否则,转换到状态 1

      如果机器处于 State 4 并点击 换行符 字符,则转换到 State 1

      如果机器处于 State 5 并遇到* 字符,则转换到 State 3

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

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

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

      【讨论】:

      • 在状态 1 中,您至少需要添加对字符串的检查——然后在该字符串中处理可能转义的 \",然后 double 转义。从好的方面来说,可以立即添加替代 C++ // cmets(然后只检查行尾)。
      • 状态机还需要具有位于字符串(或多字节字符)内的状态。可以在这里找到一个用 C 编写的简单过滤器,它将 // 样式 cmets 转换为 /* */ cmets:stackoverflow.com/a/12000755/12711 它可以用作过滤器的起点,从流中完全去除 cmets。
      • 这就是,女士们先生们,强调即使是编写一个“简单”的词法分析器来只处理 C/C++ 的一个子集也不是一件小事......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2012-04-24
      • 2015-05-08
      相关资源
      最近更新 更多