C语言编程入门之注释转换
小标 2018-06-25 来源 : 阅读 1423 评论 0

摘要:在C语言编程入门中,此项目可以将C语言的注释部分格式转换成c++的注释格式,代码其他的部分不变。希望对大家学习C语言编程入门有所帮助。

在C语言编程入门中,此项目可以将C语言的注释部分格式转换成c++的注释格式,代码其他的部分不变。希望对大家学习C语言编程入门有所帮助。

即:

 C语言编程入门之注释转换

 

思路:将C语言得到注释转换成c++的注释格式,我们可以定义一个文件指针从我们的源文件中逐次取字符与C语言的注释部分进行比较,然后将c语言的注释部分修改成c++的注释风格,其他代码字符不变,写入另一文件。

接下来就是转换函数的设计了,很明显,在这个过程中要不断的进行状态之间的转化,因此,我们可以定义几种状态,当字符序列满足特定的状态时,进行此种状态的转化,大概过程及几种状态关系如下图所值:

 C语言编程入门之注释转换

程序部分设计:

自定义头文件:Comment.h

[cpp] view plain copy
1. #ifndef __COMMENT_H__    
2. #define __COMMENT_H__    
3.   
4. #include<stdio.h>    
5. #include<stdlib.h>   
6.   
7. #define _CRT_SECURE_NO_DEPRECATE  
8. #define _CRT_SECURE_NO_WARNINGS  
9.   
10. typedef enum CONVERT_START  
11. {    
12.     NULL_START,    
13.     C_START,    
14.     CPP_START,    
15.     END_START    
16. }StateType;    
17.   
18. void CommentConvert();    
19. void ConvertWork(FILE *read,FILE *write);  //注释转换操作选项函数;    
20. void DoCState(FILE *read,FILE *write);     //C转换为cpp函数;    
21. void DoNullState(FILE *read,FILE *write);  //普通语句空转换函数;    
22. void DoCppState(FILE *read,FILE *write);   //cpp 转换 C 函数;    
23.   
24. #endif                  //__COMMENT_H__

各函数实现部分:Comment.c

[cpp] view plain copy
1. #define _CRT_SECURE_NO_WARNINGS 1    
2. #include"Comment.h"    
3.   
4.   
5. StateType state  = NULL_START;    
6.   
7.   
8. void DoNullState(FILE *read,FILE *write)   //无转换操作函数;    
9. {    
10.     int first = fgetc(read);    
11.     int second;    
12.     switch(first)    
13.     {    
14.     case'/':   
15.         second = fgetc(read);    
16.         if(second == '*')    
17.         {    
18.             fputc(first,write);    
19.             fputc('/',write);    
20.             state = C_START ;    //如果是C注释我们将状态改为C状态,并且将注释开头改为Cpp注释;    
21.         }    
22.         else if(second == '/')    
23.         {    
24.             fputc(first,write);    
25.             fputc(second,write);    
26.             state = CPP_START ;    //如果是Cpp注释我们将状态改为Cpp状态;    
27.         }    
28.         else //普通语句就直接写入;    
29.         {    
30.             fputc(first,write);    
31.             fputc(second,write);    
32.         }     
33.         break;    
34.     case EOF:    
35.         fputc(first,write);    
36.         state = END_START ;//注释结束,状态调整;    
37.         break;    
38.     default:      //开始就为普通内容,直接写入;    
39.         fputc(first,write);    
40.         break;    
41.     }    
42. }    
43.   
44. void DoCState(FILE *read,FILE *write)//C转换为Cpp;    
45. {    
46.     int first = fgetc(read);    
47.     int second = 0;    
48.     switch(first)    
49.     {    
50.     case '*':    
51.         second = fgetc(read);    
52.         if(second == '/')        //舍弃 */;    
53.         {    
54.             int third = fgetc(read);    
55.             state = NULL_START ;    
56.             if(third != '\n')    
57.             {    
58.                 fputc('\n',write);    
59.                 ungetc(third,read);    //ungetc函数的功能是将已读数据还回缓冲区;    
60.             }    
61.             if(third == '\n')    
62.             {    
63.                 fputc(third,write);    
64.             }    
65.         }    
66.         else    
67.         {    
68.             fputc(first,write);  
69.             fputc(second,write);  
70.   
71.             //ungetc(second,read);//将*之后的内容还回缓冲区;    
72.         }    
73.         break;    
74.     case '\n'://如果是换行,那就是连续注释,就将下一行开头加入Cpp注释;    
75.         fputc(first,write);    
76.         fputc('/',write);    
77.         fputc('/',write);    
78.         break;    
79.     case EOF:    
80.         fputc(first,write);    
81.         state = END_START ;    
82.         break;    
83.     default:    
84.         fputc(first,write);    
85.         break;    
86.     }    
87. }     
88.   
89.   
90. void DoCppState(FILE *read,FILE *write)//Cpp转换为C;    
91. {    
92.     int first = 0;    
93.   
94.     first = fgetc(read);    
95.   
96.     switch(first)    
97.     {    
98.     case'\n'://Cpp注释的换行就是一行注释的结束;    
99.         fputc(first,write);    
100.         state = NULL_START ;    
101.         break;    
102.     case EOF:    
103.         fputc(first,write);    
104.         state = END_START ;    
105.         break;    
106.     default :    
107.         fputc(first,write);    
108.         break;    
109.     }    
110. }    
111.   
112.   
113. void ConvertWork(FILE *read,FILE *write)//函数操作选项;    
114. {    
115.     state = NULL_START ;    
116.     while(state != END_START )    
117.     {    
118.         switch(state)    
119.         {    
120.         case NULL_START :    
121.             DoNullState(read,write);    
122.             break;    
123.         case C_START  :    
124.             DoCState(read,write);    
125.             break;    
126.         case CPP_START  :    
127.             DoCppState(read,write);    
128.             break;    
129.         default:    
130.             break;    
131.         }    
132.     }    
133. }

功能测试部分:test.c

[cpp] view plain copy
1. #include "Comment.h"    
2.   
3.   
4. void CommentConvert()       //读写文件函数;    
5. {    
6.     FILE *pWrite = NULL;       
7.   
8.     FILE *pRead = NULL;  
9.     pRead = fopen("input.c","r");  //打开文件并写  
10.     if(pRead == NULL)     
11.     {    
12.         perror("open file for read");    
13.         return ;  
14.     }    
15.   
16.     pWrite = fopen("output.c", "w");    
17.     if(pWrite == NULL)   
18.     {    
19.         fclose(pRead );    
20.         perror("open file for write");    
21.         return ;   
22.     }    
23.   
24.     ConvertWork(pRead,pWrite);    
25.     fclose(pRead );    
26.     fclose(pWrite);    
27. }   
28.   
29. int main()    
30. {    
31.     CommentConvert();  
32.   
33.     return 0;    
34. }

测试代码:input.c

[cpp] view plain copy
1. // 1.一般情况    
2. /* int i = 0; */    
3.     
4. // 2.换行问题    
5. /* int i = 0; */int j = 0;    
6. /* int i = 0; */    
7. int j = 0;    
8.     
9. // 3.匹配问题    
10. /*int i = 0;/*xxxxx*/    
11.     
12. // 4.多行注释问题    
13. /*  
14. int i=0;  
15. int j = 0;  
16. int k = 0;  
17. */int k = 0;    
18.     
19. // 5.连续注释问题    
20. /**//**/    
21.     
22. // 6.连续的**/问题    
23. /***/    
24.     
25. // 7.C++注释问题    
26. // /*xxxxxxxxxxxx*/

代码执行结果可在代码目录下找到文件:output.c

[cpp] view plain copy
1. // 1.一般情况    
2. // int i = 0;   
3.     
4.     
5. // 2.换行问题    
6. // int i = 0;   
7. int j = 0;    
8. // int i = 0;   
9.     
10. int j = 0;    
11.     
12. // 3.匹配问题    
13. //int i = 0;/*xxxxx  
14.     
15.     
16. // 4.多行注释问题    
17. //   
18. //int i=0;   
19. //int j = 0;   
20. //int k = 0;   
21. //  
22. int k = 0;    
23.     
24. // 5.连续注释问题    
25. //  
26. //  
27.     
28.     
29. // 6.连续的**/问题    
30. //**/    
31. //    
32. //// 7.C++注释问题    
33. //// /*xxxxxxxxxxxx

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程