程序员面试宝典,去除C/C++代码中…

注:添加了在行注释里面包含换行符'\'的情况,以及在字符串中包含包含"\\""的情况,该转义反斜杠而不是双引号。

#include <iostream>
//#include <string.h>
//#include <stdlib.h>
//#include <stdio.h>
#include <fcntl.h>
#include <io.h>
using namespace std;

//例5.1.1
// int i = 1;
// void main()
// {
//  int i = i; //i是一个未定义值
//  int j=i; 
// }


//例5.2.2
// void main()
// {
//  int b=3;
//  int arr[] = {6,7,8,9,10};
//  int *ptr = arr;
//  *(ptr++) += 123;
//  printf("%d,%d\n",*ptr,*(++ptr)); //输出结果为8,8
// }

//例5.4.2
// int main()
// {
//  unsigned int a = 0xfffffff7;
//  unsigned char i = (unsigned char)a;
//  char *b = (char*)&a;
//  printf("x,x\n",i,*b);
// }

//例5.5.1
// int main()
// {
//  unsigned char a = 0xA5;
//  unsigned char b = ~a>>4+1;
 //cout<<b;
//  printf("b = %d\n",b); //输出结果不是2,而是250
// return 0;
//}

//例5.8

void remove_comment(char *buf,size_t size)
{
 char *p,*end,c;    //p--动态移动的字符指针,end--指向文件末尾的字符指针,c--存储每一个p指向的字符
 char *sq_start,*dq_start; //sq_start--单引号(single quotation)开始位置,dq_start--双引号(double quotation)开始位置
 char *lc_start,*bc_start; //lc_start--//(行注释line comment)开始位置,bc_start-- //test
 p=buf;
 end = p + size;
 sq_start = NULL;dq_start = NULL;lc_start = NULL;bc_start = NULL;
 while(p < end){
  c = *p;
  switch (c){
   case '\'': //单引号  由于使用了双引号,故需要使用单引号,比如:char c = '\"';若没有单引号,则该双引号至下一个双引号之间的部分均认为是代码
    if(dq_start || lc_start || bc_start){
     p++;
     continue;
    }
    if(sq_start == NULL){
     sq_start = p++;
    }else{
     len = p++ - sq_start;
     if(len == 2 && *(sq_start + 1) == '\\')  //忽略字符中的单引号
      continue;
     sq_start = NULL;
    }
    break;
   case '\"': //双引号  比如:char filename1[100] = "//abcde/*";
    if(sq_start || lc_start || bc_start){
     p++;
     continue;
    }
    if(dq_start == NULL)
     dq_start = p++;
    else{
     if (*(p - 2) == '\\' && *(p++-1) == '\\'){  //比如在字符串中转义反斜杠字符,比如:char filename2[100] = "\\";
      dq_start = NULL;
      continue;
     }
     if(*(p++ - 1) == '\\')
      continue;
     dq_start = NULL;
    }
    break;
   case '/':
    if(sq_start || dq_start || lc_start || bc_start){
     p++;
     continue;
    }
    c = *(p+1);
    if(c == '/'){
     lc_start = p;
     p += 2;
    }else if(c == '*'){
     bc_start = p;
     p += 2;
    }else{
     p++;
    }
    break;
   case '*':
    if(sq_start || dq_start || lc_start || bc_start == NULL){
     p++;
     continue;
    }
    if(*(p+1) != '/'){
     p++;
     continue;
    }
    p += 2;
    memset(bc_start,' ',p - bc_start);
    bc_start = NULL;
    break;
   case '\n': //换行符
    if(lc_start == NULL){
     p++;
     continue;
    }
    c = *(p-1);
    if(*(p-1) == '\r' && *(p-2) == '\\' || *(p-1) == '\\')
     memset(lc_start,' ',(c == '\r' ? (p++ - 1) : p++) - lc_start);
    else{
     memset(lc_start,' ',(c == '\r' ? (p++ - 1) : p++) - lc_start);
     lc_start = NULL;
    }
//    memset(lc_start,' ',(c == '\r' ? (p++ - 1) : p++) - lc_start);
    break;
   default:
    p++;
    break;
  }
 }
 if(lc_start)  //删除最后一行的注释(所在注释行为最后一行时)
  memset(lc_start,' ',p - lc_start);
}
int main(){
 int fd,n;
 char buf[10240];
 fd = open("main.cpp",O_RDONLY,0); //test 其中main.cpp即该代码
 if(fd == -1)
  return -1;
 n = read(fd,buf,sizeof(buf));
 if(n == -1 || n == 0){
  close(fd);
  return -1;
 }
 remove_comment(buf,n);
 *(buf + n) = '\0';
 printf("%s\n",buf);
 close(fd);
 FILE *fp = fopen("save.txt","w");
 fwrite(buf,sizeof(char),n+1,fp);
 fclose(fp);
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值