去除cpp中注释的小程序

来源:互联网 发布:java参数可以传null吗 编辑:程序博客网 时间:2024/05/17 09:34


//本程序针对 vc++ 6.0 编译器语法,使用者要保证测试用例能在 vc++ 6.0 下编译通过

#include"stdio.h"
#define checkInputError(ch)  if(scanf("%c",&ch) == EOF) { printf("Error!/n");return; }
#define ERROR  printf("Error!/n");return;

static int DQM = false;// 双引号 double quotation marks
static __int64 ALL = 0;
void main() {
 char ch,ch1;
 freopen("in.txt","r",stdin);
 freopen("out.txt","w",stdout);
 while(scanf("%c",&ch) != EOF) {
  //如果读到正斜杆
  if(ch == '/') {
   checkInputError(ch);
   if(ch == '/') {
    bool flag  = false;
    while(true) {
     if(scanf("%c",&ch1) == EOF) { printf("/n//正常到文件尾"); return; }
     if(ch1 == '/n' && ch != '//') {
      printf("/n"); break;
     }
     ch = ch1;
    }
   }
   else if(ch == '*') {
    checkInputError(ch1);
    while(true) {
     checkInputError(ch);
     if(ch1 == '*' && ch == '/') break;
     ch1 = ch;
    }
   }
   else {
    printf("/%c",ch); ALL += 2;
   }
  }
  //如果读到单引号,  这里还没有处理空字符 ''
  else if(ch == '/'') {
   checkInputError(ch1);
   printf("'%c",ch1); ALL+= 2;
   if(ch1 == '/'') { printf("/*识别出空字符*/"); continue; }
   do {
    checkInputError(ch); printf("%c",ch); ALL++;
    if(ch1 == '//' && ch == '//') {  //取消识别第二个 / 为转义
     checkInputError(ch); printf("%c",ch); ALL++;
    }
    //else if(ch1 == '//' && ch == '/"') {   /*识别  /"  */ /
     checkInputError(ch); printf("%c",ch); ALL++; /
    }
    else if(ch1 == '//' && ch == '/'') {  //识别 /'
     checkInputError(ch); printf("%c",ch); ALL++;
    }
    ch1 = ch;
   } while(ch != '/'');
  }
  //如果读到双引号
  else if(ch == '/"') {
   checkInputError(ch1);
   printf("/"%c",ch1); ALL+= 2;
   if(ch1 == '/"') { printf("/*识别出了空串*/"); continue; }//识别出了空串
   do {
    checkInputError(ch); printf("%c",ch); ALL++;
    if(ch1 == '//' && ch == '/"') {   //识别  /"
     checkInputError(ch); printf("%c",ch); ALL++;
    }
    else
    if(ch1 == '//' && ch == '//') {  //取消识别第二个 / 为转义
     checkInputError(ch); printf("%c",ch); ALL++;
    }
    ch1 = ch;
   } while(ch != '/"');
  }
  //正常输出字符
  else {
   printf("%c",ch); ALL++;
  }
 }
 printf("/n //ALL = %I64d/n",ALL);
}


/*

//按 / / ' * 四个符号的相互嵌套作用分析,分成四种情况,/
采用一次扫描配对处理。
//每次读字符都要判断是否到 EOF

while(fin >> ch) {
 if 读到 / :
  fin >> ch.
  if 是 / :
   while(true) {
     if fin >> ch == EOF : 正常到达文件尾,return
    if 遇到回车: { 输出回车,break; }
   }
  else if 是 * :
   判断后面连续输入的两个字符为 *和/ 后,break
         else :
   输出  / 和 ch
   else if 读到 ' :
  fin >> ch1
  输出 ' 和 ch1
  if ch1 是 ' : 识别了空字符,continue
  do:
   继续输入后续字符
    //识别两个连续字符为 /"  ,则输出 /" ,往后跳过两格
   识别两个连续字符为 //  ,则输出 // ,往后跳过两格 //避免 / 被重用
   识别两个连续字符为 /'  ,则输出 /' ,往后跳过两格 //避免 ' 被误判为第一个 ' 的配对符
   不是以上情况,则判断位置后移一格字符
  while 输入字符 != '
   
     else if 读到 " :
  fin >> ch1
  输出 " 和 ch1
  如果ch1 是双引号:  contiune   //识别为空串
  do:
   继续输入后续字符
   识别两个连续字符为 /"  ,则输出 /" ,往后跳过两格
   识别两个连续字符为 //  ,则输出 // ,往后跳过两格
   不是以上情况,则判断位置后移一格字符
  while 输入字符 != "
 else :  按正常情况输出 ch  
}

*/

/*//测试用例:

  //abc/
abc,/
不接着 /
 abc,接着/
printf("不可思议/n");///
强/
printf("不可思议/n");/
 printf("不可思议/n");

//上面这整个用例可能被病毒利用

 //printf(""//n");
 printf("%c/n",'"');
 //printf("%c/n",''');
 //printf("%c/n",'');
 printf("'/n");
 printf("''/n");
 printf("///n");
 printf("%c/n",'/');
 printf("%c/n",'/'');
 printf("/' /n");
 printf("/"");
 printf("");
 printf("//");
 printf("///b///"");
 printf("%c",'1/3');
 printf("%c",'1/1/'');
 printf("%c",'1///'');
 printf("%c",'1///'/'');
 printf("%c",'/"/1');
 printf("%c",'/123');
 printf("%c",'/x43');
 printf("%c",'/好');
 printf("%c",'/"/3/"');
 printf("%c",'/'/3/'');
 printf("/中");
 // /*printf("*//*");
*/
//  /*/

//2009-03-25