免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3229 | 回复: 14
打印 上一主题 下一主题

[C] 贴代码,求点评,以完善编程的习惯和细节 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-18 11:46 |只看该作者 |倒序浏览
  1. # #include <stdio.h>
  2. # #include <string.h>
  3. # //本程序的功能是将C语言源码文件中的注释删除掉,并把新得到的源码文件保存为filename_delnote.c
  4. # //最后完成于2010年4月7日03:37,总耗时6小时,郁闷来着。
  5. # //作者rool,oh yeah.
  6. # void delnote(FILE *p,FILE *p_note)
  7. # {
  8. #     int flag=0;
  9. #     char w_start,w_end;
  10. #     w_start=fgetc(p);
  11. #     w_end=w_start;
  12. #     while(w_end!=EOF)
  13. #     {
  14. #         w_end=fgetc(p);
  15. #         switch(flag)    //flag的值,0表示字符是最普通的代码,1表示字符处于“”中,2表示字符是被//注释掉的,3表示字符是被/*--*/注释掉的
  16. #         {
  17. #             case 0:
  18. #             {
  19. #                 switch(w_start)
  20. #                 {
  21. #                     case '/':
  22. #                     {
  23. #                         if(w_end=='*')
  24. #                         {
  25. #                             flag=3;
  26. #                             
  27. #                         }
  28. #                         else if(w_end=='/')
  29. #                         {
  30. #                             flag=2;        
  31. #                         }
  32. #                         else fputc(w_start,p_note);
  33. #                     } break;
  34. #                     case '\"':
  35. #                     {
  36. #                         flag=1;
  37. #                         fputc(w_start,p_note);
  38. #                     } break;
  39. #                     default :fputc(w_start,p_note);
  40. #                 }
  41. #             } break;
  42. #             case 1:
  43. #             {
  44. #                 if(w_start=='\n'||w_start=='\"')
  45. #                 {
  46. #                     flag=0;
  47. #                 }
  48. #                 fputc(w_start,p_note);
  49. #             } break;
  50. #             case 2:
  51. #             {
  52. #                 if(w_start=='\n')
  53. #                 {
  54. #                     flag=0;
  55. #                     fputc(w_start,p_note);
  56. #                 }
  57. #             } break;
  58. #             case 3:
  59. #             {
  60. #                 if(w_start=='*'&&w_end=='/')
  61. #                 {
  62. #                     flag=0;
  63. #                     w_end=fgetc(p);
  64. #                 }
  65. #             } break;
  66. #             default :break;
  67. #         }
  68. #         w_start=w_end;
  69. #     }
  70. # }
  71. # int main(int argc,char *argv[])
  72. # {
  73. #     if(argv[1]==NULL)
  74. #     {
  75. #         printf("---->You must give the filename follow the command!\n");
  76. #         printf("---->你没有指定需要操作的文件名\n");
  77. #         printf("---->Just like this style:\n\tdelnote filename.c\n");
  78. #         printf("---->You can try it again\n");
  79. #         return 1;
  80. #     }
  81. #     FILE *fp,*fp_delnote;
  82. #     fp=fopen(argv[1],"r");
  83. #     if(fp==NULL)
  84. #     {
  85. #         printf("Can't find the file %s or you do not have the permision to open this file\n",argv[1]);
  86. #         return 2;
  87. #     }
  88. #     printf("---->Be patient,the note of %s are being remove...\n",argv[1]);
  89. #     int n;
  90. #     n=strlen(argv[1]);
  91. #     char Fp_delnote[n+8];
  92. #     argv[1][n-2]='\0';//截取输入文件名,并且不要后缀名
  93. #     char *a="_delnote.c";
  94. #     strcpy(Fp_delnote,argv[1]);
  95. #     strcat(Fp_delnote,a);//得到去掉注释后的输处文件名,形如filename_name.c
  96. #     fp_delnote=fopen(Fp_delnote,"w");
  97. #     delnote(fp,fp_delnote);
  98. #     fclose(fp);
  99. #     fclose(fp_delnote);
  100. #     printf("---->Good,all of the work have done.\n");
  101. #     return 0;
  102. # }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-08-18 11:51 |只看该作者
{:3_200:}

论坛徽章:
0
3 [报告]
发表于 2010-08-18 11:54 |只看该作者
有的行太长,最好不要超过80个字符,超过了就要换行。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2010-08-18 11:59 |只看该作者
argv[1][n-2]='\0';//截取输入文件名,并且不要后缀名
你认为扩展名肯定是一个字符?而且不要去修改argv

Fp_delnote[n+8];这里不够1字节

处理部分懒得看了

论坛徽章:
0
5 [报告]
发表于 2010-08-18 13:06 |只看该作者
argv[1][n-2]='\0';//截取输入文件名,并且不要后缀名
你认为扩展名肯定是一个字符?而且不要去修改argv
...
hellioncu 发表于 2010-08-18 11:59

扩展名的确不一定是一个字符,我没考虑全,的确也不该修改argv,谢谢指教哈,,
对了,不够一个字节是什么意思?我不懂?这个有何诀窍是不是和内存对齐之类有关系?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2010-08-18 13:10 |只看该作者
扩展名的确不一定是一个字符,我没考虑全,的确也不该修改argv,谢谢指教哈,,
对了,不够一个字节是什 ...
roolcz 发表于 2010-08-18 13:06



    空间不够放下你的结果文件名,少了放结束符的

论坛徽章:
0
7 [报告]
发表于 2010-08-18 16:19 |只看该作者
回复 6# hellioncu
原来是这样,看来问题很大啊,谢了

论坛徽章:
0
8 [报告]
发表于 2010-08-18 23:18 |只看该作者
记住一下原则:

1.代码不要嵌套逻辑太多,goto可以适当解决这个问题有时候
2.不要在你的代码里面出现printf等函数(我是指你封装的功能函数不需要他们,应该有专门的用户接口功能代码来处理这个问题)
3.不要写复杂的代码,除非事情本身就这么复杂
4.根据实际情况违反上面原则

论坛徽章:
0
9 [报告]
发表于 2010-08-18 23:19 |只看该作者
我没有细看你的代码,所以没有细节建议,你应该自己赏析你的代码

论坛徽章:
0
10 [报告]
发表于 2010-08-19 09:16 |只看该作者
空点行啊锅锅
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP