一道简单的笔试题

原创 2007年09月18日 10:35:00

要求:将C++源代码中的注释去掉


即,对于下列源代码


#include <iostream> // comment1

using namespace std;

/* comment 2

// #include <string> 
*/
 int main( int argc,char *argv[] /*comment 3*/ )
{
    
return 1;
}


处理后应输出

#include <iostream>

using namespace std;

int main(int argc, char * argv[])
{
    
return 1;
}


函数原型: void foo( const char * src,char * buf, unsigned char * buf_len);
其中src为源代码缓冲区,buf为输出缓冲区,buf_len为输出缓冲区的长度,又已知源代码长度不会超过1M。

编程思路很简单,基于一个简单的三状态的有穷自动机即可。foo()函数在执行过程中将在三种状态中进行转换:代码、旧式注释(//)和新式注释(/* */ )。三种状态之间的转换件如下

    当处于代码状态时,如果后续两个字符为'//',则进入旧式注释;若后续两个字符为'/*',则进入新式注释;否则保持当前状态,并将下一个字符复制进输出缓冲区。三种情况下都要对读指针进行相应的调整。

    当处于旧式注释状态时,如果下一个字符为'/n'(换行符),则进入代码状态,并且将'/n'也复制进输出缓冲区;否则仍保持当前状态。两种情况下都要对读指针进行相应的调整。

    当处于新式注释状态时,如果下两个字符为'*/',则进入代码状态;否则保持当前状态。两种情况下都要对读指针进行相应的调整。
 

实现代码如下:
#include <iostream>
#include 
<fstream>
using namespace std;

const char STAR='*';
const char SLASH='/';
const char NEWLINE=' ';
const unsigned int MAX=1048576;


enum State
{
    CODE,
    OLD_STYLE,
    NEW_STYLE,
}
;

void foo(const char * src,char * buf, unsigned int buf_len)
{
    State state
=CODE;

    
const char * ptr= src;
    unsigned 
int count=0;

    
while(     count<(buf_len-1)
        
&& count<MAX
     )
    
{
    
switch(state)

    
{
        
case CODE:
        
        
if*ptr==SLASH && *(ptr+1)==SLASH)
        
{
            state
=OLD_STYLE;
            ptr
+=2;
        }

        
else if*ptr==SLASH && *(ptr+1)==STAR)
        
{
            state
=NEW_STYLE;
            ptr
+2;
        }

        
else
        
{
            buf[count
++]=*ptr;
            ptr
++;
        }


        
break//end of case CODE

        
case OLD_STYLE:
        
        
if*ptr==NEWLINE)
        
{
            state
=CODE;
            buf[count
++]=*ptr;        //注意这里不要在输出中遗漏换行符
            ptr++;
        }

        
else
        
{
            ptr
++;
        }


        
break;//end of case OLD_STYLE

        
case NEW_STYLE:

        
if*ptr==STAR && *(ptr+1)==SLASH)
        
{
            state
=CODE;
            
//如果注释结束紧接着换行符的话,要跳过这个换行符
            if*(ptr+2)==NEWLINE )   
            ptr
+=3;
            
else
            ptr
+=2;
        }

        
else
        
{
            ptr
++;
        }


        
break;// end of case NEW_STYLE
       
        
default:
        cout
<<"Oh,should not happen!"<<endl;


    }
 //end of switch


    }
// end of while

    buf[count
++]='';
    
    
return ;
}

int main(int argc,char *argv[])
{

    
char source[MAX]=    {'',};
    
char stripped[MAX]=    {'',};
    
    
    ifstream original_file(
"input");
    original_file.read(source,MAX);

    foo ( source,stripped,
sizeof(source));

    ofstream stripped_file(
"output");
    stripped_file.write(stripped,strlen(stripped));

    original_file.close();
    stripped_file.close();


    
return 1;
}


相关文章推荐

C++及Windows异常处理(try,catch; __try,__finally; __try, __except)——一道笔试题引起的探究

题目: int* p = 0x00000000; // pointer to NULL puts( "hello "); __tr...
  • whatday
  • whatday
  • 2013年08月03日 10:30
  • 961

Jquery学习,一道笔试题:关于表格

九月份的一次笔试中,看到一道web编程题,当时只是想着用jquery应该很好实现,但是对知识不是很熟,所以随便写写,回头又一直在想这件事,就开始一直在想着,想来想去都觉得有些障碍,后来问了一下flas...
  • dont27
  • dont27
  • 2011年10月03日 10:34
  • 549

一道某互联网公司的笔试题(Android九宫格锁屏)

问题:android手机的锁屏屏幕,手指划过的距离最长为多少?

从一道笔试题来看指针的使用

原文地址:http://blog.csdn.net/demon__hunter/archive/2009/04/30/4140603.aspx 从一道笔试题来看指针的使用 不运行程序,问下面代码的输出...

一道亚信联创笔试题--双目运算符的重载

昨天做了亚信联创实习生的笔试,

一道笔试题(扑克牌顺子)

题目:一幅扑克牌,任意抽取5张,判断是5张牌是否是顺子。“顺子”指的是五张牌的紧紧相连的五张牌,如A,2,3,4,5或者8,9,10,J,Q,其中,大小王可以代表任意你想代表的牌。设计一个程序判断随机...

华为一道笔试题:打印2~2000的所有素数,要求尽量快

传统算法: 逐个判断是不是素数,有的简单优化就是在判断的时候使用的上限是平方根,当然每个数字还是要逐个判断,使用的是i++的形式 这里使用的是筛法: 并不是逐个判断,筛法的定义为: 先把N...
  • cilen
  • cilen
  • 2011年10月13日 11:12
  • 1931

关于位运算的一道试题校招笔试题

之前参加某公司的比试有一道题至今还记得,一直在寻找最优解法,今天又看到了一个更好的方法。 题目具体的不记得了,大概就是输入一个char类型的数,然后统计二进制表示的1的个数。 我当时的解法很二逼,从n...

GOOGLE的一道笔试题—求给定连通无环无向图可以生成的最小高度树

最近看到一道谷歌笔试题,“已知一颗无向无环连通图T的所有顶点和边的信息, 现需要将其转换为一棵树,要求树的深度最小,请设计一个算法找到所有满足要 求的树的根结点,并分析时空复杂度(描述算法即可,无...

Java中有关构造函数的一道笔试题解析

Java中有关构造函数的一道笔试题解析 1、具体题目如下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一道简单的笔试题
举报原因:
原因补充:

(最多只允许输入30个字)