平成16年度春期 基本情報技術者試験(FE)の午後問題10は、
- C言語の注釈を除去して標準出力へ出力するプログラム
に関する問題でした。

プログラム1(h16h_fe_pm10_1.c)
実行結果
コンパイル後、自分自身(h16h_fe_pm10_1.c)の注釈を除去してみました。うまく除去できているようですが、これはたまたまうまく実行できたにすぎません。
$ gcc h16h_fe_pm10_1.c && ./a.out < h16h_fe_pm10_1.c
#include <stdio.h>
void quote(char );
int main(void) {
int c1, c2;
while ((c1 = getchar()) != EOF) {
if (c1 == '\'') quote('\'');
else if (c1 == '\"') quote('\"');
次に9行目をif (c1 == '\'')だけにして実行してみると、以下のように注釈文がきちんと除去されませんでした。これは設問1の内容ですが、先の実験が偶然うまくいったにすぎないということが分かりますね。
$ ./a.out < h16h_fe_pm10_1.c
#include <stdio.h>
void quote(char );
int main(void) {
int c1, c2;
while ((c1 = getchar()) != EOF) {
if (c1 == '\'')
/* 二重引用符の検出 */
else if (c1 == '\"') quote('\"');
プログラム2(h16h_fe_pm10_2.c)
プログラム1の欠点を修正したものが以下です。
実行結果
プログラム1では除去できなかった注釈文を今度はきちんと除去することができました。
$ gcc h16h_fe_pm10_2.c && ./a.out < h16h_fe_pm10_1.c
#include <stdio.h>
void quote(char );
int main(void) {
int c1, c2;
while ((c1 = getchar()) != EOF) {
if (c1 == '\'')
else if (c1 == '\"') quote('\"');