去除注释

题目描述:

1. 将一个.c文件1复制到另一个文件2中,要求过滤掉文件1中的注释。

注释类型:以//开头或者/**/中的注释。用一个函数完成该功能。

基本要求:假设//或者/**/不会出现在printf语句中。

高级要求:要能处理printf中的//或者/**/

练习目的:练习文件的基本操作

//klkl//kk;;l/*l;;l*/

/*klklk/*k;k;l

lklkl*/

/*klklkl//klklkl*/

/*上述红色字体部分都是注释*/

main()

{

printf("here // should not be handled as comment");

printf("here /* .. */ should not be handled as comment");

}

状态转换图:

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
FILE * inputFile, *outputFile;
int curState = 0;
char curChar;
char commentBuffer[10]="";
int bufferSize = 0;

void handleCurChar()
{
    switch(curState)
    {
        case 0:
            if(curChar == '/')
            {
                commentBuffer[bufferSize] = curChar;
                commentBuffer[++bufferSize] = '\0';
            }
            else
            {
                fputc(curChar, outputFile);
            }
            break;
        case 1:
            if(curChar == '/' || curChar == '*')
            {
                commentBuffer[0] = '\0';
            }
            else
            {
                fputs(commentBuffer, outputFile);
                commentBuffer[0] = '\0';
                fputc(curChar, outputFile);
            }
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            fputc(curChar, outputFile);
            break;
        case 5:
            break;
        case 6:
            if(curChar == '/')
            {
                commentBuffer[bufferSize] = curChar;
                commentBuffer[++ bufferSize] = '\0';
            }
            else
            {
                printf("%c", fputc(curChar, outputFile));
            }
            break;
    }
}
void changeState()
{
    switch(curState)
    {
        case 0:
            if(curChar == '/')
            {
                curState = 1;
            }
            else if(curChar == '"')
            {
                curState = 4;
            }
            else
            {
                curState = 6;
            }
            break;
        case 1:
            if(curChar == '/')
            {
                curState = 2;
            }
            else if(curChar == '*')
            {
                curState = 3;
            }
            else if(curChar == '"')
            {
                curState = 4;
            }
            else
            {
                curState = 6;
            }
            break;
        case 2:
            if(curChar == '\n')
            {
                curState = 6;
            }
            else
            {
                curState = 2;
            }
            break;
        case 3:
            if(curChar == '*')
            {
                curState = 5;
            }
            else
            {
                curState = 3;
            }
            break;
        case 4:
            if(curChar == '"')
            {
                curState = 6;
            }
            else
            {
                curState = 4;
            }
            break;
        case 5:
            if(curChar == '/')
            {
                curState = 6;
            }
            else
            {
                curState = 3;
            }
            break;
        case 6:
            if(curChar == '/')
            {
                curState = 1;
            }
            else if(curChar == '"')
            {
                curState = 4;
            }
            else
            {
                curState = 6;
            }
            break;
    }
}
void clearComments()
{
    while(!feof(inputFile))
    {
        curChar = fgetc(inputFile);
        handleCurChar();
        changeState();
    }
}
int main(void){
    printf("hello");
                              /*指向两个文件的指针*/
	if((inputFile=fopen("1.txt","r"))==NULL)             /*假如打不开的情况*/
	{
		printf("File could not be opened\n");
	}
	else if((outputFile=fopen("2.txt","w"))==NULL)
	{
		printf("File could not be opened\n");
	}
	else                                              /*打开之后引用函数*/
	{
		clearComments();
	}
	fclose(inputFile);                                   /*关闭文件*/
	fclose(outputFile);
	getchar();
	return 0;
}
时间: 2024-10-11 03:34:20

去除注释的相关文章

VC6.0 ASSISTANT X插件去除注释语法检查

有时候用 ASSISTANT X时候,会在你的注释的地方进行语法检查,你懂的,中文支持很烂,老是看到红字,处女座怎么容许看到红色的波浪线老是出现. 1.点开工具-定制 类别选择Add-in 然后单击画圈的地方 拖放到工具栏上,单击它,跳出设置界面 把勾去掉就可以啦

jd-gui 反编译后去除注释

默认情况下,使用jd-gui反编译时会有注释. 行号注释 /* 521:502 */ 元信息 /* Location:           D:\core-1.0.0.jar * Qualified Name:     com.co * JD-Core Version:    0.7.0.1 */ jd-gui 反编译时就可以设置不加注释 Help--Preference 去掉Sources saver 下的两个复选框

【sqli-labs】 less23 Error based - strip comments (基于错误的去除注释的GET型注入)

. 加单引号报错 加# http://localhost/sqli-labs-master/Less-23/?id=1'%23 错误没有改变,推测过滤了# 查看源码发现# -- 都被替换掉了 那么可用通过闭合单引号的方式 http://localhost/sqli-labs-master/Less-23/?id=1' and '1'='1 然后通过UpdateXml函数利用报错取数据 http://localhost/sqli-labs-master/Less-23/?id=1' and Upd

只使用awk去除配置文件的注释等无效信息

题目: 只用awk去除配置文件中,注释,空行: 注: 1. 配置文件注释是#开始,到行尾,和shell中注释类似: 2. 注释,包括注释行和行尾注释: 3. 空行,包括只含有换行符的行和只有空白符的行: 解决方法: 1.  只去除注释行.行尾注释.不含空白符的行的方法: awk -F '#' '($1) { print $1}' xxx.conf 2.  只去除注释行.行尾注释.空行.含空白符的空行的方法: awk -F # '{ ($1 && $1 !~ /^[[:blank:]]*$/

PHP 之去除代码中的注释

测试文件代码如下: <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/10/16 * Time: 10:25 */ // 计算和 // 计算和 // 计算和 $a = 1; $b = 2; $c = $a+$b; //总和 /* * 求和函数 */ function sum($a, $b) { return $a + $b; //返回值 } # 第二种注释 $a = 1; $b = 2; ## 求乘积 $c = $a * $b;

multiwii 2.4配置页面中文注释

1 #ifndef CONFIG_H_   2 #define CONFIG_H_   3    4 /*************************************************************************************************/   5 /****           可配置参数                                                 ****/   6 /**************

PowerDesigner 的mysql PDM 的COMMENT注释

PowerDesigner 的mysql PDM 的COMMENT注释 2012-11-01 15:38 4447人阅读 评论(0) 举报 分类: 数据库相关(7) PowerDesigner 的mysql PDM 的COMMENT注释 一 . 生成注释 默认的pd没有生成注释,针对mysql5.0可以如下修改. 在Database-->edit Current DBMS... 设置dbms的属性,找到mysql5.0-->script-->objects-->column--&g

vim编辑器-多行加注释与去注释

在使用vim编辑器时,有时候需要对多行代码进行加注释或去注释,它不像我们在类似于vs等下,需要我们自己输入命令操作,下面将介绍两种方法. 方法一:块选择模式 1. 插入注释 (1)首先按键盘上的ESC进入命令行模式 (2)再按Ctrl+V进入VISUAL BLOCK模式 (3)利用上下左右键调整需要注释多少行以及行的宽度 (4)再按Shift+i或s进入插入模式 (5)输入代表注释的符号,比如# (6)再次按ESC键,这时就可完成多行注释(可能需要等上一会,不要着急) 2. 去注释 前三步与加注

vim 批量注释和取消

vim批量注释操作 在vim中,需要注释代码时,比如bash,需要在行首加上一个#号 对于注释少行的代码,可以手动每行加上,但是在遇到主要注释很多行的时候, 手动的方法就不靠谱,因此可以用上批量注释操作的命令 批量注释 从需要被注释的第一行开始,将光标移动到行首, 按下 Ctrl + v 接着按下方向键下,一直移动到需要被注释的最后一行, 这时可以看到,这些需要被注释的行的行首第一个字符已经全部被选中 然后按下 Shift + i,批量插入, 这时光标会跳到第一行的行首,不用管,继续按下Shif