CodeSky 代码之空

随手记录自己的学习过程

C 删除C语言程序中的所有注释

2014-02-22 23:20分类: C评论: 0

题目: 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言中,注释不允许嵌套。

还是看答案吧,毕竟是导言,我并不指望自己能写出来,代码还是勉强能看懂的,就是处理引号部分还不大明白(如为什么echo_quote里搜索\\),留待以后回头再看看这个问题。

另外这个程序一个问题就是分段落输出,这样比较无力……不晓得是不是我码错了什么……换言之,确实它值得改进的地方还有很多,注释也自己乱加了点OTZ。

1#include <stdio.h>
2
3void rcomment(int c);
4void in_comment(void);
5void echo_quote(int c);
6
7/* 移除所有注释 */
8main(void)
9{
10    int c, d;
11
12    while ((c = getchar()) != EOF)
13        rcomment(c);
14    return 0;
15}
16
17/* 阅读每个字节,移除注释 */
18void rcomment(int c)
19{
20    int d;
21
22    if (c == '/')
23        if ((d = getchar()) == '*')
24            in_comment();       /* 开始注释 */
25        else if (d == '/') {
26            putchar(c);             /* 另一个斜杠 */
27            rcomment(d);
28        } else {
29            putchar(c);             /* 不是注释 */
30            putchar(d);
31        }
32    else if (c == '\'' || c == '"')     /* 引号中的内容原样输出 */
33        echo_quote(c);      /* 引用开始 */
34    else
35        putchar(c);     /* 不是注释 */
36}
37
38/* in_comment函数:在一个有效的注释内 */
39void in_comment(void)
40{
41    int c, d;
42    c = getchar();  /* 上一个字节 */
43    d = getchar();  /* 所在的字节 */
44    while (c != '*' || d != '/') {  /* 搜索结束标志 */
45        c = d;
46        d = getchar();
47    }
48}
49
50/* echo_quote函数:每个函数内的字符 */
51void echo_quote(int c)
52{
53    int d;
54
55    putchar(c);
56    while ((d = getchar()) != c) {  /* 搜索结束标志 */
57        putchar(d);
58        if (d == '\\')
59            putchar(getchar());
60    }
61    putchar(d);
62}
63

明明按照官方的说法这货要碰到EOF在输出啊OTZ

评论 (0)