+ -
当前位置:首页 → 问答吧 → 贴代码,求点评,以完善编程的习惯和细节

贴代码,求点评,以完善编程的习惯和细节

时间:2010-08-18

来源:互联网

  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. # }
复制代码

作者: roolcz   发布时间: 2010-08-18

作者: lenky0401   发布时间: 2010-08-18

有的行太长,最好不要超过80个字符,超过了就要换行。

作者: jackin0627   发布时间: 2010-08-18

argv[1][n-2]='\0';//截取输入文件名,并且不要后缀名
你认为扩展名肯定是一个字符?而且不要去修改argv

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

处理部分懒得看了

作者: hellioncu   发布时间: 2010-08-18



QUOTE:
argv[1][n-2]='\0';//截取输入文件名,并且不要后缀名
你认为扩展名肯定是一个字符?而且不要去修改argv
...
hellioncu 发表于 2010-08-18 11:59


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

作者: roolcz   发布时间: 2010-08-18



QUOTE:
扩展名的确不一定是一个字符,我没考虑全,的确也不该修改argv,谢谢指教哈,,
对了,不够一个字节是什 ...
roolcz 发表于 2010-08-18 13:06




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

作者: hellioncu   发布时间: 2010-08-18