往年的深信服笔考试齐全.docx

上传人:b****3 文档编号:5467231 上传时间:2023-05-08 格式:DOCX 页数:12 大小:21.75KB
下载 相关 举报
往年的深信服笔考试齐全.docx_第1页
第1页 / 共12页
往年的深信服笔考试齐全.docx_第2页
第2页 / 共12页
往年的深信服笔考试齐全.docx_第3页
第3页 / 共12页
往年的深信服笔考试齐全.docx_第4页
第4页 / 共12页
往年的深信服笔考试齐全.docx_第5页
第5页 / 共12页
往年的深信服笔考试齐全.docx_第6页
第6页 / 共12页
往年的深信服笔考试齐全.docx_第7页
第7页 / 共12页
往年的深信服笔考试齐全.docx_第8页
第8页 / 共12页
往年的深信服笔考试齐全.docx_第9页
第9页 / 共12页
往年的深信服笔考试齐全.docx_第10页
第10页 / 共12页
往年的深信服笔考试齐全.docx_第11页
第11页 / 共12页
往年的深信服笔考试齐全.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

往年的深信服笔考试齐全.docx

《往年的深信服笔考试齐全.docx》由会员分享,可在线阅读,更多相关《往年的深信服笔考试齐全.docx(12页珍藏版)》请在冰点文库上搜索。

往年的深信服笔考试齐全.docx

往年的深信服笔考试齐全

往年的深信服笔考试(齐全)

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

∙一,六道选择题(可以多选)

1char *p = "hello world"; p存储在()指向//堆栈

 char p[] = "hello world"; p存储在()指向

 全局变量 //数据段

 static变量 //数据段

 分别在哪个地方?

 

 1数据段 2代码段 3堆 4堆栈 

(此题可以配合同文件夹下的char.cpp)

(二、例子程序  

 这是一个前辈写的,非常详细  

 //main.cpp  

 int a = 0; 全局初始化区  

 char *p1; 全局未初始化区  

 main()  

 {  

 int b; 栈  

 char s[] = "abc"; 栈  

 char *p2; 栈  

 char *p3 = "123456"; 123456\0在常量区,p3在栈上。

  

 static int c =0; 全局(静态)初始化区  

 p1 = (char *)malloc(10);  

 p2 = (char *)malloc(20);  

 分配得来得10和20字节的区域就在堆区。

  

 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456" 

 优化成一个地方。

  

 }不知道是那个高人怎么想的和我一样,我估计中间应该有错误)

2%&.&&  <==那个优先级别最高

.&%<=&&=

3

4以下哪些通信方式是可靠的通讯方式 

 1信号2管道3消息4tcp5udp6串口I/O 

5是(M)?

(a++):

(a--),此处的M等于我选C

A,M==O,B,M==1,C,M!

=O,D,M!

=1

6是Unix的启动顺序排序。

(6个选项)

1是数制转换151转2进制和九进制。

10010111177

2已知0的ASCII码为0x40,那么int 120;在内存中的表示形式是0x__ 78(0的ASCII码为0x40,应该为0x30)

3

1、在linux下,查看目录大小的命令是:

du–shdirname

    2、修改文件属性的命令是:

chomd/chgrp

   3、切换为其他用户身份的命令是:

su

 

4还有一道指针交换数值inti=0,j=10,int*p=&i,int*q=&j,

intfun(**a,*b)

{int*temp=a;

*a*=10;

*b*=10;

a=b;

b=temp;

}最后问调用fun(&p,q)问i、j、p、q的最终值(具体形式大概如此,但中间指针肯定记的错误)

此题主要考察指针指向一个整数,然后利用指针改变变量,最后交换指针

∙5有道填插入排序的算法。

有一个数组a[0]到a[i-1]为从小到大排序,a[i]到a[count-1]没有排序,请您添加3条语句使它们按照从小到大排序

intinsert_sort(inta[],intcount)

{

for(inti=1;i

{

intj,t;

t=a[i];

(j=i-1;)

while(j>=0&&t

{

(a[j+1]=a[j];)

j--;

}

(a[j+1]=t;)

}

return0;

}

三,编程与逻辑题

1自己写一个strstr

(单链表判断有无环,)

char*strstr(char*buf,char*sub)

{

char*bp;

char*sp;

If(!

*sub)

returnbuf;

while(*buf)

{bf=buf;

sp=sub;

do{if(!

*sp)

returnbuf;

}

while(*bp++==*sp++)

buf+=1;

}

return0;

}

2遍历文本找单词并删掉出现频率最少的单词,fun(char*pText)

 #include 

#include  //定义av_list、av_start、av_arg等宏

∙3实现一个与printf功能相似的函数

#include 

#include 

#include 

#include  //定义av_list、av_start、av_arg等宏

/*******************************************************************

此函数的作用:

    实现一个参数个数可变的函数,此函数的功能与printf类似,

    但在格式处理上,不如printf丰富

    无异常,返回一个true,否则返回false

format字符串的合法情况如下:

    1."%%zyk%%zyk%%",OUTPUT:

%zyk%zyk%

    2."%dzyk%fzyk%s",OUTPUT:

(int)zyk(float)zyk(string)

    3."zyk",    OUTPUT:

zyk

非法情况如下:

    1."%zyk%"    ERROR:

不存在%z格式、%后面必须跟一个格式字符

*******************************************************************/

bool zykPrintf(const char * format,...)

{

    //定义一个可用于指向参数的指针(实为char *),

    va_list argPtr;

    //把函数的第一个参数format的地址传给argPtr

    va_start(argPtr,format);

        

    const int size = strlen(format)+1;

    char *tmp = new char[size];

    memset(tmp, 0, size);

∙while (*format !

= 0)

    {

        int i;

        for (i=0; i

='%' && *format!

=0; i++)

        {

            tmp[i]=*format++;

        }

        tmp[i] = 0; //在有效的字符串末尾作0值防护

        printf("%s",tmp);

        if (*format == 0)

            return true;

        switch(*++format)

        {

        //按指定类型读取下一个参数,并打印

        case 'd':

 { printf("%d", va_arg(argPtr, int)); break;}

        case 's':

 { printf("%s", va_arg(argPtr, char *)); break; }

        case 'c':

 { printf("%c", va_arg(argPtr, char)); break;}

        case 'f':

 { printf("%f", va_arg(argPtr, float)); break;}

        

        //对%%的处理

        case '%':

 { printf("%%"); break; }

        //格式错误

        default :

 { printf("Error Ocurr!

Please Check the Format!

"); return false;}

        }

        ++format;

    }

    

    delete[] tmp;

    return true;

}

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

{

    zykPrintf("%zyk"); //error

    zykPrintf("zyk%"); //error

    zykPrintf("%%zyk%%zyk%%"); //OUTPUT:

 %zyk%zyk%

    zykPrintf("\nzyk is a pretty boy!

 His age is %d and %s",5,"I love zyk^_^!

");

                     getch();

                     return 0;

}

文章引用自:

∙4是一道逻辑题,有的数是2,3,5的倍数,在三位数中出去可整除这三个数的和

(5升和3升桶量4升水)

四,改错题三道

1tozero算法

2比较简单

3是高质量里的一道题

五,问答题

1VC中有哪些方法避免C编程中的头文件重复包含:

#ifndef!

!

!

!

#def!

!

!

!

#endif

2在C++中externc的作用

(按键转换,比如点击p输出q)

作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

extern"C"是连接申明(linkagedeclaration),被extern"C"修饰的变量和函数是按照C语言方式编译和连接的

3编程中异步IO和同步IO有什么区别?

说说你可知道的几种IO?

4使用异步socket编程,通常因为网络拥塞send不出数据,会获得什么样的错误码(windows下举例),通常如何处理这种情况?

(核心太与用户太的区别,x86如何转换。

5将程序移植到不同的32位cpu中,经常出现结构字节对齐和大小端的问题,有哪能些方法避免?

(是子网源码的判断,计算,ABCDE网络的区别,DE网络的用途,)

6怎样解决在vc中内存泄漏的问题(release版本)

(1)放置关键字assert()

(2)生成map文件。

它并不往exe文件中添加任何东西,仅仅只是把编译连接时的所有函数入口地址记录在后缀为.map文件。

程序崩溃的时候,可以得到一个崩溃时的EIP地址,通过地址可以很容易的查到崩溃所在的函数。

(在vcsetting下有个link按钮选上generatemapfile)

(3)Release版本也是可以设置断点的,在希望设置断点处加入_asmint3

(4)熟悉汇编,通过编译时的汇编看出

(5)使用第三方调试器。

(6)关掉发行版中的一些优化选项,生成调试信息。

(是p2p软件在nat用户里实现数据互传的原理

开发类笔试全部是C/C++,要求对底层有一定的了解开发类的笔试题目比较晕,共五页纸,要求两个钟头完成(我的简历没有通过筛选,我是去霸王笔的-_-)好像考的内容都跟网上流传的差不多,题目内容大致如下:

希望对参加深信服笔试和面试的同学有所帮助:

1.选择题:

6题 第一题是考变量和值的存储位置(堆/栈/代码段/数据段等) 最后一题是Unix系统的启动顺序,其他几题比较简单。

2.填空题:

4/5题 考sizeof、指针、数制转换、排序等,看过高质量C/C++应该都没有问题。

3.改错题:

3题 有道题跟高质量C/C++中一道指针题类似,不过那题中没有错,原本不需要修改,却反倒被我改错了,汗...另外两题比较简单。

4.编程题:

4/5题 判断链表有没有环(要求用两种方法); 实现C中的printf

深圳某公司几个vc/mfc笔试题目(含参考答案)

1:

Release版本下如何解决memoryleak以及非法操作的BUG。

(搞不清什么非法操作)

2:

在异步socket时,为什么有时send不出数据,会报什么错误(分windows/linux下),你一般怎么处理?

下面是几个编程的

3:

实现strstr模型(我晕,我写了个函数,只是不是strstr,而是strchr)

4:

实现printf类似的函数,voidmyprintf(char*str,...)

(用consoleAPI吗?

好像在哪书上看到可用那些API实现,嘿,我就写了个std:

:

cout<<)

5:

删除文本文件中出现频率最小的单词,(文件里以空格表示间隔一个单词)

voidfunc(char*pTxt)

1、strstr的实现原型。

char*my_strstr(constchar*str,constchar*strSearch)

{

while(*str!

='\0')

{

char*p=(char*)str;

char*ps=(char*)strSearch;

while(ps&&*p==*ps)

p,ps;

if('\0'==*ps)

return(char*)str;

str;

}

returnNULL;

}

2、从指定文本中删除出现频率最少的单词,如果有多个,则都删除。

实现voidfunc(char*pTxt)函数。

...看单词处理,论坛中很多都有涉及

3、printf的实现。

intprintf(constchar*format,...)

{

va_listarglist;

intbuffing;

intretval;

va_start(arglist,format);

_ASSERTE(format!

=NULL);

#ifdef_MT

_lock_str2(1,stdout);

__try{

#endif/*_MT*/

buffing=_stbuf(stdout);

retval=_output(stdout,format,arglist);

_ftbuf(buffing,stdout);

#ifdef_MT

}

__finally{

_unlock_str2(1,stdout);

}

#endif/*_MT*/

return(retval);

}

4、VC中有哪些方法避免C编译头文件重复。

(除了#ifndef/#define/#endif外,就想不出来了)

#pragmaonce

5、extern"C"的用法。

用于提供C接口,如使用C命名方式等.

6、异步socket编程中,send不出数据的错误码是什么,(举Linux或Windows为例),你是怎么处理的?

非阻塞SOCKET,SEND不出数据的原因有2个吧,TCP下连接断开了和该SOCKET处在阻塞状态(也就是说在发送数据中)。

UPD发不出只有TCP后面的情况。

处理的办法就是记录下该SOCKET的状态,当状态为阻塞的时间,放入缓冲,当该SOCKET再次可写时,发送。

7、异步IO和同步IO有什么区别?

举例说明有几种(如read)?

异步IO当函数返回时不一定就完成了IO操作,而同步IO已经完成了。

所以异步IO需要有一个事件,当IO完成时会设置此事件,调用者在事件上等待。

8、32位系统中,出现结构字节对齐的问题和大小端的问题的避免?

#pragmapack(4)

9、如何查出内存泄漏和非法操作的BUG(在Release版本下)?

使用map文件

1,PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。

而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。

而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。

这点大家应该都明白。

2,如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。

SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。

SendMessage在同一线程中发送消息并不入线程消息队列。

如果在不同线程内。

最好用PostThreadMessage代替PostMessage,他工作的很好。

SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。

这是SendMessage的一般情况,事实上,处理过程要复杂的多。

比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。

3,msdn:

IfyousendamessageintherangebelowWM_USERtotheasynchronousmessagefunctions(PostMessage,SendNotifyMessage,andSendMessageCallback),itsmessageparameterscannotincludepointers.Otherwise,theoperationwillfail.

如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。

最好不要用PostMessage发送带有指针参数的消息。

PostMessage和SendMessage的区别主要在于是否等待其他程序消息处理。

PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行。

这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2