ANSI C 删除注释

本文介绍了一个C语言程序,用于删除源代码中的注释,同时保留单引号和双引号中的内容。程序通过转移字符数组和函数处理,实现对指定代码段的修改。
摘要由CSDN通过智能技术生成
 /*
 *	笔者:老年痴呆的梦
 *	编码: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键,即可看到效果。
 * 如有不对,欢迎指正!
 */

有一个问题没解决。

手动输入和直接复制程序效果有些差别的。

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值