C语言课程设计》一3.3 删除C程序注释

3.3 删除C程序注释

【例3.3】删除合法C程序的注释部分,命令行格式为:rcomment inputFile outputFile。
题目分析
程序遇到注释的开始“/”时,调用RemoveComment函数跳过注释部分,直到遇到匹配的注释结束“/”。
需要注意,当遇到多个连续的斜杠‘/’但无星号‘’匹配时,应保留斜杠‘/’。当遇到前单引号或前双引号时,引号内的“/”和“*/”不应当做注释处理。主程序调用EchoQuote函数,保留引号内的所有字符,直到遇到匹配的后前单引号或后双引号。还应注意,不要将引号内转义符‘’后的引号匹配成后引号。
参考程序

/*
 * 文件名: rcomment.c
 * 描述: 删除合法C程序的注释部分。
 *      命令行格式为:rcomment inputFile outputFile
 * 作者: 刘博 
 */
#include <stdio.h>
#include <stdlib.h> 

void RemoveComment(FILE *fp);
void EchoQuote(int c, FILE *fpIn, FILE *fpOut);

int main(int argc, char *argv[])
{
    FILE *fpIn, *fpOut;
    int c, n;
    
    /* 检查命令行参数个数 */  
    if (argc != 3) {
        printf("Usage: rcomment InputFile OutputFile\n");
        exit(1);
    }
    
    /* 打开文件 */ 
    if ((fpIn = fopen(argv[1], "r")) == NULL) {
        printf("rcomment: can't open %s\n", argv[1]);
        exit(1);
    }
    if ((fpOut = fopen(argv[2], "w")) == NULL) {
        printf("rcomment: can't open %s\n", argv[2]);
        exit(1);        
    }
    
    while ((c = fgetc(fpIn)) != EOF) {
        if (c == '/') {
            if ((n = fgetc(fpIn)) == '*') {     /* 注释开始 */ 
                RemoveComment(fpIn);
            } else if (n == '/'){        /* 处理连续多个斜杠 */
                fputc(c, fpOut);                
                ungetc(n, fpIn);
            } else {                /* 非注释部分 */ 
                fputc(c, fpOut);
                fputc(n, fpOut);
            }
        } else if (c == '\'' || c == '\"') {    /* 单引号和双引号内处理 */ 
            EchoQuote(c, fpIn, fpOut);
        } else {
            fputc(c, fpOut);            /* 非注释部分 */ 
        }
    }
    
    /* 关闭文件 */
    fclose(fpIn); 
    fclose(fpOut);
}

void RemoveComment(FILE *fp)
{
    int c, n;
    
    c = fgetc(fp);    
    n = fgetc(fp);     
    
    while (c != '*' || n != '/') {        /* 寻找注释结尾 */    
        c = n;
        n = fgetc(fp);
    }
}

void EchoQuote(int c, FILE *fpIn, FILE *fpOut)
{
    int n;
    
    fputc(c, fpOut);
    while ((n = fgetc(fpIn)) != c) {        /* 寻找后引号 */ 
        fputc(n, fpOut);
        if (n == '\\') {    /* 引号内转义符后的引号非后引号 */    
            fputc(fgetc(fpIn), fpOut);
        }
    }
    fputc(n, fpOut);
}

习题

  1. 比较两个文本文件并打印出它们第一个不相同的行(文件每行字符数不多于80)。
  2. 文本文件num1.txt和num2.txt中各有一组用空格分隔的整数,将num1.txt和num2.txt联合排序,并将结果保存在num3.txt中,如图 3-1所示。

image

  1. 现有两个文本文件db1.txt和db2.txt。db1.txt中第一列为姓名,第二列为英语成绩;db2.txt中第一列为姓名,第二列为数学成绩。通过姓名字段将db1.txt文件关联到db2.txt文件生成db3.txt文件。db3.txt文件第一列为姓名,第二列为英语成绩,第三列为数学成绩,第四列为平均成绩,如图 3-2所示。

image

  1. 检查C源程序的圆括号和大括号是否匹配。正确的例子如({((…)(…))}()),不正确的例子如{(})。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值