C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句,要正确处理带引号的字符串与字符常量,以C语言中,注释不允许嵌套。

本程序运行后,将要求用户输入一个当前目录下的C源码程序文件名,读取后,将文件中的所有注释删除掉。

将另存为*_noc.ext文件,*中可以包含多个点,.ext可以为空(即没有文件扩展名)。

编辑C源码:

User@User-PC MINGW32 /d/mycode/c/krc

$ vim k0137.c

/* 读取一个C源码文件,将其中的注释全部删除掉,并保存为新文件*_noc.c */

#include

#include

#include

#define MAXLEN 100 //文件名称最大长度

#define FILEMAXLEN 10000 //文件内容最大长度

int readline(char str[]);

int newfilename(char file[],int len);

int main(void){

FILE *fp;

char ch,file[MAXLEN],content[FILEMAXLEN];

int len,i=0;

int lastpos=-1;//第一个斜线的位置

int iscomment=0;//是注释标志位

int isstring=0;//是字符串内

char strstart;//开始的字符串是单引号还是双引号

printf("读取当前目录下的文本文件,请输入文件名:\n");

while((len=readline(file))>0) {

if((fp=fopen(file,"rt"))==NULL){

printf("文件打开错误,请重新输入:\n");

}else{

while((ch=fgetc(fp))!=EOF){

if(isstring==1){

//字符串内,查找字符串结束字符,且其前一个字符不能是反斜线

if(ch==strstart&&content[i-1]!='\\'){

isstring=0;

}

content[i]=ch;

++i;

}else if(iscomment==2){

//多行注释,查找多行注释的结束符

if(ch=='/'){

if(i-lastpos==1){

iscomment=0;

}

}else if(ch=='*'){

lastpos=i;

}

}else if(iscomment==1){

//单行注释,查找换行符

if(ch=='\n'){

iscomment=0;

content[i]=ch;

++i;

}

}else{

content[i]=ch;

if(ch=='*'){

if(i-lastpos==1){

iscomment=2;

i-=2;//多行注释的开始符号要删除

}

}else if(ch=='/'){

if(i-lastpos==1){

iscomment=1;

i-=2;//单行注释的两个斜线要删除

}else{

iscomment=0;

lastpos=i;

}

}else if(ch=='\''||ch=='"'){

isstring=1;

strstart=ch;

}

++i;

}

}

fclose(fp);

content[i]='\0';//fputs写入文件的字符串以'\0'结束

printf("\n\n新文件的内容:\n");

i=0;

while((ch=content[i])!='\0'){

putchar(ch);

++i;

}

len=newfilename(file,len);

printf("是否保存新文件%s?(y/n):",file);

while((ch=getchar())!='y'&&ch!='n');

if(ch=='y'){

if(len>0){

fp=fopen(file,"w+");

fputs(content,fp);

fclose(fp);

printf("文件已成功保存!\n");

ch=getchar();

}

}

}

printf("请输入新的文件名:\n");

}

return 0;

}

/* 将文件名更改为*_noc.ext,.ext可以为空,*中可以包含点. */

int newfilename(char file[],int len){

int i,j,c;

int extflag=0,newlen=0;

char newfile[MAXLEN];

//printf("\nfile:%s,len:%d\n",file,len);

for(i=len-1,j=0;i>=0;--i,++j){

c=file[i];

newfile[j]=c;

if(extflag==0&&c=='.'){

++j;newfile[j]='c';

++j;newfile[j]='o';

++j;newfile[j]='n';

++j;newfile[j]='_';

extflag=1;

}

}

newfile[j]='\0';

if(j==len){

//文件没有后缀名称,则直接在后面加上_noc

i=len;

file[i]='_';

++i;file[i]='n';

++i;file[i]='o';

++i;file[i]='c';

++i;

}else{

newlen=j;

for(i=0,j=newlen-1;j>=0;--j,++i){

file[i]=newfile[j];

}

}

file[i]='\0';

return i;

}

/* 读取文件名,不需要后面的\n */

int readline(char str[]){

int i,c;

for(i=0;i

str[i]=c;

}

str[i]='\0';

return i;

}

编译生成可执行文件

User@User-PC MINGW32 /d/mycode/c/krc

$ gcc -o k0137 k0137.c

运行测试

User@User-PC MINGW32 /d/mycode/c/krc

$ ./k0137

读取当前目录下的文本文件,请输入文件名:

hello.c

新文件的内容:

#include

int main(void){

printf("hello world!\n");

printf("世界你好!\n");

return 0;

}

是否保存新文件hello_noc.c?(y/n):y

文件已成功保存!

请输入新的文件名:

User@User-PC MINGW32 /d/mycode/c/krc

$

hello.c文件内容:

User@User-PC MINGW32 /d/mycode/c/krc

$ vim hello.c

/* C源码文件:helloworld */

#include

int main(void){

printf("hello world!\n");

printf("世界你好!\n");//查看显示中文是否正常

return 0;

}

(全文完)

c语言程序设计删除,C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句...相关推荐

  1. c语言删除一行程序代码,删除C语言程序中所有的注释语句的实现代码

    一种解法非常好:状态机.在各种状态之间跳转,逻辑清晰,不易出错,出错了也容易调试. 下面把代码贴出来: #include int state; int c1,c2; void change_state ...

  2. 从头学C语言——(1)编写一个简单的C程序

    编写一个简单的C程序 编译器安装完成之后,我们就可以用它来编写代码了. 这里用Dev C++作为示例,我的是5.11的版本(后续版本是其他人开发的分支版本). 1.双击打开软件, 2.点击左上角工具栏 ...

  3. python123程序设计题说句心里话_用c++写一个简单的计算器程序

    // 050305.cpp : 定义控制台应用程序的入口点. // // 050304.cpp : 定义控制台应用程序的入口点. // //四则运算 #include "stdafx.h&q ...

  4. 怎么用C语言编写一个求解幂函数的程序 成都软件开发

    其实在绝大多数C语言编译器内部是有幂函数这个函数的,具体的指令是pow(a,b),这个指令实现的功能就是求解a^b的值,也就是求解a的b次方. 例如,假如我们要求解6的7次方,并把最终的结果存入变量r ...

  5. c语言编写一个成绩等级的程序,c语言作业 编写一个输出学生成绩等级的程序

    问题描述: c语言作业 编写一个输出学生成绩等级的程序 1.能够使用if else语句实现. 2.多分支结构的正确使用. 3.能够使用switch case语句实现. 4.正确使用break语句 5. ...

  6. vb编写一个计算机配置选择程序,2016计算机二级《VB程序设计》练习题及答案

    2016计算机二级<VB程序设计>练习题及答案 一.选择题 1.以下能够触发文本框Change事件的操作是(C) A.文本框失去焦点 B.文本框获得焦点 C.设置文本框的焦点 D.改变文本 ...

  7. 用C语言编写一个申请内存的程序

    虚拟内存与实际内存 虚拟内存指的是,程序向操作系统所申请的内存空间,这个空间不一定会使用,这个空间也可以比服务器实际可提供内存空间大. 实际内存是程序所申请的内存页与物理内存中的物理页进行一一映射的内 ...

  8. c语言编写一个火车票,C语言-多线程抢火车票软件

    //今晚内容:C语言-抢火车票软件 //讲课老师:范志军  QQ:208824435 #include #include HANDLE hMutex;//互斥锁变量 int a=50;//设定50张车 ...

  9. c语言程序 强制关机程序,怎么用C或者C++编写一个电脑强制关机程序

    源代码: #include #include #include using namespace std; int main(int argc, char *argv[]) { system(" ...

最新文章

  1. 对ESB概念的理解(转)
  2. BZOJ3709: [PA2014]Bohater
  3. java动态菜单显示实现,java – 为Spring MVC / AOP应用程序实现动态菜单
  4. xmapp apache与mysql无法启动_XAMPP Apache Mysql 无法启动原因及解决方法
  5. hadoop1常见配置含义
  6. java中为什么要用注解_java中的注解,真的很重要,你理解了嘛?
  7. 利用资源文件实现多语言的系统
  8. 【论文解读】[目标检测]retinanet
  9. ListView原理分析之重要方法介绍
  10. 常见的API接口管理工具
  11. ElasticSearch 从5.6.3升级到7.9.3遇到问题总结
  12. Android 开发基于Webview 自制一个简单的手机浏览器
  13. IDEA设置一键导包
  14. jquery仿直播app按钮点赞特效
  15. tipask二次开发总结_测试经验总结(“二次开发”)
  16. 在VS Code中开发ESP32遇到如下IDF_PATH环境变量不一致的警告问题
  17. 前端报错:net::ERR_ABORTED 404
  18. Fastbot_Android稳定性测试
  19. 一台Linux服务器上挂载另一台Linux服务器文件系统的方法
  20. 关键词推广:如何选择更精准的关键词?

热门文章

  1. wpf之通过MVVM绑定MouseEnter
  2. SpringBoot之第一个Restfu示例
  3. C#之获取系统cpu
  4. CVPR学习(四):CVPR2019-目标检测
  5. LED显示驱动(五):视频设备显示驱动调试步骤总结
  6. java mysql resultset_Java数据库——ResultSet接口
  7. WordPress搬家插件迁移网站的方法(从一台服务器搬到另一台服务器)
  8. tcp测试监听工具_高清无码多图详解!性能测试六大核心体系(没人的时候偷偷看)...
  9. linux命令ps -aux|grep xxx详解
  10. c语言中数组的变量j是什么,c语言中数组,一般数组