【发布时间】:2020-02-06 14:57:36
【问题描述】:
我希望用 C 编写一个程序,它读取输入并只打印某些输出(特别是它省略了 cmets)。
澄清:我希望它的行为与 C 处理器完全一样。我相信 C 处理器会用空格替换 cmets,所以一旦我检测到注释的结尾,我就可以用空格替换它。
这意味着这个程序应该正确处理三元组、转义引号和其他可能影响 cmets 的事情。
该函数忽略其输入中的任何注释字符。例如,除了字符串中的输入,它会忽略所有 C 注释形式的输入(例如,/* 和 */ 之间的输入以及// 和换行符 (\n) 之间的输入)。
请注意,在第二种情况下,会打印换行符,而在第一种情况下,/* 和 */ 都不会打印。
然而,在一个字符串中(例如"hello //world"),程序将打印注释说明符之后的任何内容(在这种情况下,它会打印"hello //world",即使“world”前面有一个单行C-注释说明符)。
到目前为止,我已经尝试考虑过几种情况。我考虑过定义两个变量sngl_line 和multi_line 来确定输入何时在a // 和a \n 之间(即sngl_line 为真)或输入何时在/* 和*/ 之间(即multi_line 是真的)。
我编写了一个忽略字符串之外的 cmets 的程序,但我发现处理三元组特别成问题。也许我应该稍后再处理它们?
我还希望我的程序产生错误(例如,如果有非终止双引号或注释,它会打印适当的错误消息)。 注意:我已经成功编写了一个程序,它可以按预期忽略 cmets(除非字符串中存在三元组)。所以我不希望看到任何有效的 C 代码;只需一些关于如何产生正确错误的一般提示就足够了。
【问题讨论】:
-
有很多关于在 C 代码中删除 cmets 的问题的答案。请注意,
'//'也不会开始评论。注意“单行”注释行末尾的反冲换行符。注意/*、*/或//中间的反斜杠换行符。另请注意,编译器会将注释替换为空白(空格)。 -
为什么要重新发明轮子?你检查过他的 C 预处理器吗?
-
@AdrianCornish 有时最好的学习方法是重新发明一个已有的轮子。如果 OP 以前没有使用过状态机,这将是学习它们的一个很好的练习。
-
@TripeHound 公平点,但新编码人员也会浪费数百万工时来完成已完成的工作。
-
@AdrianCornish 新程序员如果只是加入其他人的库,就永远不会成为优秀老程序员。 某人必须足够优秀才能编写新库!