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

简介: 本节书摘来自华章出版社《C语言课程设计》一书中的第3章,第3.3节,作者 刘博 董学文,更多章节内容可以访问云栖社区“华章计算机”公众号查看

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源程序的圆括号和大括号是否匹配。正确的例子如({((…)(…))}()),不正确的例子如{(})。
相关文章
|
2月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
4月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
115 1
|
4月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
152 1
|
4月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
214 0
|
27天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
53 5
|
27天前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
59 4
|
26天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
57 1
|
27天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
38 2
|
27天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
37 1
|
2月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序