网上搜索了一大堆去掉/*和*/之间注释的代码,就像<The C Programming Language>练习1-23里有人说的一样
大部分都会被以下的程序broken,这个功能看起来简单,实际上很有难度.网上实现的代码,除了我找到的一个用文件指针实现的没有问题外,其余的都存在各种bug,不信的话就用以下的程序测试一下:-),当然这个程序也不够完善.
还是有限状态自动机实现起来更严谨也容易理解得多:
/* krx123tp.c - a test program to serve as input to krx123*.c * * This is a shameless copy of Ben Pfaff's solution, to which I have * added a few extra statements to further test the candidate programs * for this exercise. As Ben says, this program already contains lots * of examples of comments and not-quite-comments. I've just made it * a little tougher. * */ /* K&R2 1-23: Write a program to remove all comments from a C program. Don't forget to handle quoted strings and character constants properly. C comments do not nest. This solution does not deal with other special cases, such as trigraphs, line continuation with /, or <> quoting on #include, since these aren't mentioned up 'til then in K&R2. Perhaps this is cheating. Note that this program contains both comments and quoted strings of text that looks like comments, so running it on itself is a reasonable test. It also contains examples of a comment that ends in a star and a comment preceded by a slash. Note that the latter will break C99 compilers and C89 compilers with // comment extensions. Interface: The C source file is read from stdin and the comment-less output is written to stdout. **/ #include <stdio.h> int main(void) { /* State machine's current state. */ enum { PROGRAM, SLASH, COMMENT, STAR, QUOTE, LITERAL } state; /* If state == QUOTE, then ' or ". Otherwise, undefined. */ int quote; state = PROGRAM; for (;;) { int c = getchar(); if (c == EOF) { if (state == SLASH) putchar('/' / /**/ 1 / 1 /'/1'); break; } if(0) printf("%d/n", 6/'/2'); /* line of code, and comment, added by RJH 10 July 2000 */ switch (state) { case SLASH: /* Program text following a slash. */ if (c == "/*"[1]) { state = COMMENT; break; } putchar('/'); state = PROGRAM; /* Fall through. */ case PROGRAM: /* Program text. */ if (c == '/'' || c == '"') { quote = c; state = QUOTE; putchar(c); } else if (c == "/*"[0]) state = SLASH; else putchar(c); break; case COMMENT: /* Comment. */ if (c == '*') state = STAR; break; case STAR: /* Comment following a star. */ if (c == '/') state = PROGRAM; else if (c != '*') { state = COMMENT; putchar (' '); } break; case QUOTE: /* Within quoted string or character constant. */ putchar(c); if (c == '//') state = LITERAL; else if (c == quote) state = PROGRAM; break; case LITERAL: /* Within quoted string or character constant, following /. */ putchar(c); state = QUOTE; break; default: abort(); } } return /* this comment added by RJH 10 July 2000 */ 0; } /* Local variables: compile-command: "checkergcc -W -Wall -ansi -pedantic knr123.c -o knr123" End: */
您还没有登录,请您登录后再发表评论
Java的设计目标是成为分布式计算环境中的面向对象编程语言,它的语法与C++相似,但在简化方面做了很多工作,比如去除了容易导致错误的指针操作,增加了自动内存管理等特性。 Java的主要特点包括: 1. **强类型**:...
《CoreJava学习笔记》 Java,作为一种广泛使用的高级编程语言,以其独特的特性和优势深受开发者喜爱。本学习笔记旨在深入浅出地介绍Java的核心概念,帮助初学者快速掌握这一强大的工具。 1. Java特点 Java语法...
Python作为一种高级编程...总体而言,这份Python学习笔记详细介绍了Python语言的基础知识和面向对象的高级特性,适合有C或C++语言基础的初学者,通过系统性地学习Python的语法知识和操作示例,可以快速入门Python编程。
### Java学习笔记知识点详解 #### 一、Java简介与特点 **什么是Java?** Java是一种广泛使用的编程语言,由Sun Microsystems公司于1995年发布。它具有以下几个方面的含义: 1. **编程语言(先编译再解释)**:...
### Java学习笔记——Java基础知识整理 #### 一、Java技术入门 Java是一种广泛使用的编程语言,因其跨平台性、安全性和高效性而受到青睐。Java最初由Sun Microsystems开发,并于1995年首次发布。 ##### 1. Sun ...
### Java基础学习笔记知识点详解 #### 一、Java的核心特性 Java作为一种广泛使用的编程语言,其核心特性包括简明性、面向对象、网络感知、健壮性、安全性、架构中立性、可移植性、解释性、高性能、多线程和动态性...
Java的设计理念强调简洁性和可移植性,它吸取了C++的优点,但去除了许多复杂和容易导致错误的特性。 Java的主要特点包括: 1. **强类型**:Java是一种静态类型的编程语言,这意味着在编写代码时必须声明变量的类型...
### CoreJava学习笔记 #### 一、JAVA特点与运行原理 **JAVA特点:** 1. **简单性**:Java的设计者们将C++语言中许多不易理解和容易混淆的部分去除,使得Java更容易理解与掌握。 2. **面向对象**:Java几乎一切都...
《毕向东java笔记》是一份详尽的Java学习资源,适合初学者使用。笔记涵盖了Java编程的基础到进阶内容,包括源代码示例,有助于理解与实践。以下是笔记中涉及的主要知识点: 1. **Java特性与优势**: - **简单性**...
- **简单性**:Java设计时借鉴了C++,但去除了指针和多继承等复杂特性,使得代码更加简洁。 - **面向对象**:Java是一种纯面向对象的语言,一切皆为对象。 - **平台无关性**:Java通过JVM(Java虚拟机)实现了...
- **简单性**:Java设计时借鉴了C++,但去除了指针等复杂概念,使得语法更加简洁。 - **面向对象**:Java是一种纯面向对象的编程语言,支持封装、继承和多态。 - **可移植性**:Java程序编译成字节码,可以在任何...
#### 1.1 针对考研数据结构的代码书写规范及C/C++语言基础 - **目的**:考研时,代码不仅需要正确运行,还需要让阅卷老师能够快速理解,因此编写规范的代码尤为重要。 - **区别于编译器运行**:考试时的代码评判者...
这些特性使得Java相比C++更易于管理和避免错误,例如,它提供了自动内存管理,消除了手动内存分配和释放的问题,还去除了指针,以减少出错的可能性。 Java虚拟机(JVM)是实现跨平台的关键,它使得Java程序在不同...
相关推荐
Java的设计目标是成为分布式计算环境中的面向对象编程语言,它的语法与C++相似,但在简化方面做了很多工作,比如去除了容易导致错误的指针操作,增加了自动内存管理等特性。 Java的主要特点包括: 1. **强类型**:...
《CoreJava学习笔记》 Java,作为一种广泛使用的高级编程语言,以其独特的特性和优势深受开发者喜爱。本学习笔记旨在深入浅出地介绍Java的核心概念,帮助初学者快速掌握这一强大的工具。 1. Java特点 Java语法...
Python作为一种高级编程...总体而言,这份Python学习笔记详细介绍了Python语言的基础知识和面向对象的高级特性,适合有C或C++语言基础的初学者,通过系统性地学习Python的语法知识和操作示例,可以快速入门Python编程。
### Java学习笔记知识点详解 #### 一、Java简介与特点 **什么是Java?** Java是一种广泛使用的编程语言,由Sun Microsystems公司于1995年发布。它具有以下几个方面的含义: 1. **编程语言(先编译再解释)**:...
### Java学习笔记——Java基础知识整理 #### 一、Java技术入门 Java是一种广泛使用的编程语言,因其跨平台性、安全性和高效性而受到青睐。Java最初由Sun Microsystems开发,并于1995年首次发布。 ##### 1. Sun ...
### Java基础学习笔记知识点详解 #### 一、Java的核心特性 Java作为一种广泛使用的编程语言,其核心特性包括简明性、面向对象、网络感知、健壮性、安全性、架构中立性、可移植性、解释性、高性能、多线程和动态性...
Java的设计理念强调简洁性和可移植性,它吸取了C++的优点,但去除了许多复杂和容易导致错误的特性。 Java的主要特点包括: 1. **强类型**:Java是一种静态类型的编程语言,这意味着在编写代码时必须声明变量的类型...
### CoreJava学习笔记 #### 一、JAVA特点与运行原理 **JAVA特点:** 1. **简单性**:Java的设计者们将C++语言中许多不易理解和容易混淆的部分去除,使得Java更容易理解与掌握。 2. **面向对象**:Java几乎一切都...
《毕向东java笔记》是一份详尽的Java学习资源,适合初学者使用。笔记涵盖了Java编程的基础到进阶内容,包括源代码示例,有助于理解与实践。以下是笔记中涉及的主要知识点: 1. **Java特性与优势**: - **简单性**...
- **简单性**:Java设计时借鉴了C++,但去除了指针和多继承等复杂特性,使得代码更加简洁。 - **面向对象**:Java是一种纯面向对象的语言,一切皆为对象。 - **平台无关性**:Java通过JVM(Java虚拟机)实现了...
- **简单性**:Java设计时借鉴了C++,但去除了指针等复杂概念,使得语法更加简洁。 - **面向对象**:Java是一种纯面向对象的编程语言,支持封装、继承和多态。 - **可移植性**:Java程序编译成字节码,可以在任何...
#### 1.1 针对考研数据结构的代码书写规范及C/C++语言基础 - **目的**:考研时,代码不仅需要正确运行,还需要让阅卷老师能够快速理解,因此编写规范的代码尤为重要。 - **区别于编译器运行**:考试时的代码评判者...
这些特性使得Java相比C++更易于管理和避免错误,例如,它提供了自动内存管理,消除了手动内存分配和释放的问题,还去除了指针,以减少出错的可能性。 Java虚拟机(JVM)是实现跨平台的关键,它使得Java程序在不同...