K&Rを読もう(16) 演習 1-23 コメントの除去

/* */コメントの除去。

//====  コメント除去テスト
/*****************************************
 * 
 * ex-1-23.c
 *
 *****************************************/
//==== ここまで
#include <stdio.h>
#include <stdlib.h>

enum {IN, OUT};

int main(void)
{
    int c,d;
    int status = OUT;
    
    c = getchar(); /* 現在の文字 */

    while (c != EOF) {
        d = getchar(); /* 1文字先読み */
        if (c == '/' && d == '*' && status == OUT)
            status = IN;
        else if (c == '*' && d == '/' && status == IN) {
            d = getchar(); /* 読み飛ばす */
            status = OUT;
        } else if (status == OUT)
            putchar(c);

        c = d;
    }
    exit(EXIT_SUCCESS);
}

一文字先読みアルゴリズムを知ってれば簡単。知らないとかなり大変だと思う。

テスト。

//====  コメント除去テスト

//==== ここまで
#include <stdio.h>
#include <stdlib.h>

enum {IN, OUT};

int main(void)
{
    int c,d;
    int status = OUT;

    c = getchar();

    while (c != EOF) {
        d = getchar();
        if (c == '/' && d == '*' && status == OUT)
            status = IN;
        else if (c == '*' && d == '/' && status == IN) {
            d = getchar();
            status = OUT;
        } else if (status == OUT)
            putchar(c);

        c = d;
    }
    exit(EXIT_SUCCESS);
}

さっぱり消えた!!

  • ネストしたコメントには対応してません。
  • //も同じように出来るのでパス。

追記

引用符に囲まれたコメントも除去されてしまう。