/*
* 笔者:老年痴呆的梦
* 编码:GB 18030
* 语言:C语言
*/
/* ANSI C 删除程序中所有注释,单行只保留一个换行符;多行只保留一个换行符。 */
#include <stdio.h>
#define MAXNC 14000U
/* 函数声明 */
int transfer (char to[], unsigned int lim);
unsigned int delete_comment (char str[], unsigned int position, int lim);
unsigned int single_quotation_mark (char str[], unsigned int position, int lim);
unsigned int double_quotation_mark (char str[], unsigned int position, int lim);
int main ()
{
short a,b; /* 为了不更改要复制的数组下标信息,而出现 */
char original [MAXNC]; /* 原本数组 */
char transform[MAXNC]; /* 删除注释后的数组 */
unsigned int pos_o, pos_t; /* 两种数组的位置信息 */
pos_o = pos_t = a = b = 0;
transfer (original, MAXNC);
while (original[pos_o] != '\0' )
{
/* 注释判断开始 */
if (original[pos_o] == '/')
{
pos_o = delete_comment (original, pos_o, MAXNC);
++pos_o;
}
else if (original[pos_o] == '\'')
{
a = pos_o;
transform[pos_t] = original[a];
pos_o = single_quotation_mark (original, pos_o, MAXNC);
b = pos_o;
for (a = a + 1; a <= b; ++a)
{
++pos_t;
transform[pos_t] = original[a];
}
a = b = 0;
}
else if (original[pos_o] == '\"')
{
a = pos_o;
transform[pos_t] = original[a];
pos_o = double_quotation_mark (original, pos_o, MAXNC);
b = pos_o;
for (++a; a <= b; ++a)
{
++pos_t;
transform[pos_t] = original[a];
}
a = b = 0;
}
/* 正文照常复制 */
else
{
transform[pos_t] = original[pos_o];
++pos_o;
++pos_t;
}
}
printf ("%s\n",transform);
return 0;
}
/* 删除注释。记录注释内容的位置区域,让本区域不出现在新的数组里 */
unsigned int delete_comment (char str[] , unsigned int position , int lim)
{
short state = 0;
if (str[position] == '/')
if (str[position + 1] == '*')
state = 1;
while (position < lim - 1 && str[position] != '\0' && state == 1)
{
++position;
/* 寻找对应的注释结束符 “* /” */
if (str[position] == '*')
if (str[position + 1] == '/')
state = 2;
}
return position;
}
/* 检测单引号,让程序正常运行下去。因为引号里可能包含注释符 */
unsigned int single_quotation_mark (char str[], unsigned int position, int lim)
{
short state = 1;
while (position < lim - 1 && str[position] == '\'' && state == 1)
{
++position;
if (str[position] == '\'')
state = 0;
}
return position;
}
/* 检测双引号,让程序不要误删正文。因为引号里可能包含注释符 */
unsigned int double_quotation_mark (char str[], unsigned int position, int lim)
{
short state = 1;
while (position < lim - 1 && str[position] == '\"' && state == 1)
{
++position;
if (str[position] == '\"')
state = 0;
}
return position;
}
/* 把getchar输入的文本流,保存到字符数组里 */
int transfer (char to[], unsigned int lim)
{
int from, i ;
for (i = 0; i < lim - 2 && (from = getchar ()) != EOF; ++i)
{
if (from == '\n')
to[i] = '\n';
to[i] = from;
}
if (to[i - 1] != '\n')
{
to[i] = '\n';
++i;
to[i] = '\0';
}
else
to[i] = '\0';
return i;
}
/* 程序思想:把要删除注释的源代码复制到一个字符数组中,再通过函数记录数组位置信息,进行复制到另一个数组里。
* 输出修改后的数组即可的到删除注释后的源代码。
* 程序使用方法,编译后,运行程序把要本源代码复制到程序中,按住ctrl + z键,即可看到效果。
* 如有不对,欢迎指正!
*/
有一个问题没解决。
手动输入和直接复制程序效果有些差别的。