摘要:在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+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号