`
CharlesCui
  • 浏览: 427370 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

笔试题目草稿-C语言基础及算法

阅读更多

 

#include <stdlib.h>

 

typedef struct foo

{

    int x;

    int y;

    unsigned long ptr;

    char* buffer;

}foo_t;

 

代码一:

考察考生对可执行文件空间结构的认识.堆,栈,初始化空间及未初始化空间的作用.

 

foo_t* factory(int x,int y) 

{

    foo_t fp;

// foo_t* fp = (foo_t*)malloc(sizeof(foo_t));

    if(x>0 && x < 1024)

        fp.x = x;

//fp->x = x;

    if(y>0 && y < 768)

        fp.y = y;

//fp->y = y;

 

    return &fp;

//return fp;

}

 

 

代码二:

考察考生对变量及变量指针声明时是否分配可用空间的理解.

int add_buffer() 

{

    foo_t* fp;

    /*

 need malloc before use a pointer.

 */

    //fp = (foo_t*)malloc(sizeof(foo_t));

    fp->buffer = "hello alibaba";

 

    printf("BUFFER => %s\n",fp->buffer);

    /*

 need free the malloced pointer.

 */

    //free(fp);

    return 0;

}

 

代码三:

考察考生是否对细节足够仔细.

该段代码是RSHASH算法的变形,要对输入的字符串逐个作HASH运算,但while循环中条件写错,导致死循环.

unsigned int Hash(char *str)

{

unsigned int b = 378551;

unsigned int a = 63689;

unsigned int hash = 0;

    /*

 str need ++

 */

while (*str)

{

hash = hash * a + (*str);

a *= b;

}

return hash;

}

 

代码四:

考察考生对多线程操作的理解,本题目的陷阱在于对一个多线程共享的全局变量做自加操作时,是否需要加锁.

这个题目代码较多,但结构很清晰,如果考生不能正确阅读多线程调度的代码,则不能准确定位到问题.

 

一个函数dobench用作并发调度,其中关键结构体如下:

 

typedef struct bench

{       

void* func;//业务函数

void* param;//业务参数

long n;//每个线程要执行的次数

long count;//并发计数器

long num;//并发的线程总数

pthread_cond_t cond;

pthread_mutex_t mutex;

}bench_t;

 

 

该函数的调用方式如下:

 

pthread_t tid;

for(i = 0; i < p->num; ++i)

{

/* 通过多线程并发执行 */

if (pthread_create(&tid,NULL,dobench,p) < 0) {

syslog(LOG_ERR, "Create thread failed. - %m\n");

}

syslog(LOG_NOTICE, "Created a thread.\n");

}

 

b的类型为bench_t.

 

dobench的原型如下:

 

void dobench(void* param)

{

int i;

void(* func)(void* param);

struct bench * p = (struct bench *) param;

struct timeval tvStart,tvEnd;

func = p->func;

syslog(LOG_NOTICE, "Thread[%lld] dobench variables inited.\n",pthread_self());

//起始时间

gettimeofday(&tvStart,NULL);

if (p->n > 0) {

for (i=0; i < p->n; i++) {

func((void*)p->param);

}

}

else {

syslog(LOG_NOTICE, "struct bench * p->n should graet than 0\n");

}

//终止时间

gettimeofday(&tvEnd,NULL);

double dif;

dif = 1000000*(tvEnd.tv_sec-tvStart.tv_sec) + (tvEnd.tv_usec-tvStart.tv_usec);

syslog(LOG_NOTICE,"Thread[%lld] Cost => %f\n",pthread_self(),dif);

/*

 加锁->计数器加一->条件变量触发->解锁

 每当一个线程迭代完成指定的任务时,都要通过条件变量通知主线程.

 */

//pthread_mutex_lock(&p->mutex);

p->count++;

pthread_cond_signal(&p->cond);

//pthread_mutex_unlock(&p->mutex);

return;

}

传递给dobench的参数param是个全局变量, param->num是要启动工作的线程总数.

主线程通过param->count这个计数器来判断当前已执行完的线程数,是否等于param->num,如果等于,则表示所有的线程已经工作完成,主线程可以退出.

请排查该原型代码中的错误.

 

 

代码五:

考察考生对正则表达式的理解和运用.

 

正则表达式:

邮件地址:name@domain,其中name和domain部分,只能出现大小写字母,点(.)以及下划线(_),

请写出一个正则表达式能够取出name部分和domain部分分组.

举例:zheng.cuizh@gmail.com

能够取到zheng.cuizh以及gmail.com

如果地址中有非法字符,则不继续匹配.

 

match中的参数是答案

 

>> mail="zheng.cuizh@gmail.com"

=> "zheng.cuizh@gmail.com"

 

>> mail.match(/^([a-zA-Z0-9\.\_]*)?\@([a-zA-Z0-9\.\_]*\.[a-zA-Z0-9\.\_]*)$/)

=> #<MatchData "zheng.cuizh@gmail.com" 1:"zheng.cuizh" 2:"gmail.com">

>> mail.match(/^([a-zA-Z0-9\.\_]*)?@([a-zA-Z0-9\.\_]*\.[a-zA-Z0-9\.\_]*)$/)

=> #<MatchData "zheng.cuizh@gmail.com" 1:"zheng.cuizh" 2:"gmail.com">

>> mail.match(/^([a-zA-Z0-9\.\_]*)@([a-zA-Z0-9\.\_]*\.[a-zA-Z0-9\.\_]*)$/)

=> #<MatchData "zheng.cuizh@gmail.com" 1:"zheng.cuizh" 2:"gmail.com">

 

代码六:

这段代码考察考生在做字符串操作的时候是否考虑越界.

 

这段代码是测试rpc_call方法在执行若干次后是否出错的代码,rpc_call这个函数需要在每次调用的时候使用一个唯一的id,这个id我们通过uuid方法获得.但该段代码存在一个错误,请找出.

 

int rpc_call(char *);

char* uuid();

 

int caller()

{

    char name[32];

    int i = 100;

 

    while(i--)

    {

        //sprintf(name,"%s",uuid);

        //or

        //memset(name,0,16);

        strcat(name,uuid());

syslog(LOG_ERR,"current name is => %s",name);

        rpc_call(name);

    }

 

}

 

 

 

代码七:

下面这段代码考察考生对位运算的理解.

 

long generate();

 

unsigned long l = generate();

 

下面这个运算起到什么作用?

l<<1;

l>>1;

 

下面这个运算起到什么作用?

l&=0xfffffffe

 

 

代码八:

下面这个题目考察考生对异常处理底层实现的理解.

 

请使用setjmp.h中的方法实现C的异常处理.

 

#include <setjmp.h>

jmp_buf jb;

int ret = setjmp(jb);

switch(ret)

{

case 0:/*ok*/;break;

case 1:exc1_handler();break;

case 2:exc2_handler();break;

default:default_handler();

}

 

if(a==b){/*do ok*/}

else{/*raise exception*/longjmp(jb,1)}

1
0
分享到:
评论

相关推荐

    草稿-----存储

    标题中的“草稿-----存储”可能是指一个未完成或暂存的关于数据存储技术的讨论。虽然描述为空,但我们可以从标签“源码”和“工具”中推测,这篇文章可能会涉及存储系统的源代码分析或是使用特定工具进行数据存储和...

    c代码-C语言链表草稿

    总的来说,"C代码-C语言链表草稿"这个主题涵盖了C语言中链表数据结构的基础知识,包括链表节点的定义、链表操作(如插入和删除)以及内存管理。通过学习和实践这部分内容,开发者能够增强对C语言和数据结构的理解,...

    不跑贷(v1草稿-独家)产品设计原型.rp

    不跑贷(v1草稿-独家)产品设计原型.rp

    ffmpeg渐隐渐显草稿-修改图片路径即可

    在这个特定的场景中,"ffmpeg渐隐渐显草稿-修改图片路径即可" 提供了一个基础的实现,帮助用户通过FFmpeg实现图片的渐隐渐现效果,这在创建影集或动态幻灯片时非常有用。下面我们将深入探讨如何使用FFmpeg来实现这一...

    草稿-py处理文件-web页面展示

    标题 "草稿-py处理文件-web页面展示" 暗示了这个项目是关于使用Python来处理文件,并将处理结果在Web页面上进行展示。这是一个常见的需求,特别是在数据分析、文件管理或者Web应用开发中。接下来,我们将深入探讨...

    0268 不跑贷(v1草稿-独家).rar

    本文将深入探讨“0268 不跑贷(v1草稿-独家).rp”这一原型文件所代表的知识点,以及在实际项目开发中如何运用这些概念。 首先,“不跑贷”很可能是一款金融贷款相关的应用程序或服务,其目标可能是提供安全、便捷...

    欧洲标准草稿 - 无线电设备安全要求规范

    The content overview is about draft common safety requirements specified by CEN for different types of radio equipment that process data. This includes equipment connected to the Internet, child care-...

    ajax自动保存草稿 ajax自动保存草稿

    在编写长文或者编辑内容时,自动保存草稿的功能显得尤为重要,因为它可以防止由于网络问题、浏览器崩溃或用户意外关闭页面而导致的数据丢失。 在实现Ajax自动保存草稿的过程中,主要涉及以下几个关键知识点: 1. *...

    quic-shutdown:草稿-ietf-quic-shutdown

    标题"quic-shutdown:草稿-ietf-quic-shutdown"涉及到的是QUIC协议的一个关键特性——快速关机(QUIC Shutdown)。这是一个用于优雅地结束QUIC连接的机制,目的是在关闭连接时避免数据丢失和不必要的延迟。有序关闭是...

    HTTPSignatures:一个Burp Suite扩展,实现了Signing HTTP Messages草稿-ietf-httpbis-message-signatures-01草稿

    支持rsa-sha256算法用于签名的消息( RSASSA-PKCS1-v1_5 [ ]使用SHA-256 [ ])和SHA-256的摘要头部。 该扩展程序可在Burp Suite Professional和免费的Burp Suite社区版中使用。 用法 安装 下载文件,然后通过...

    大学软件工程专业C语言课件

    期末评估包括课堂表现、实时编程测试和笔试,分别占总成绩的20%、30%和50%,这要求学生不仅要在课堂上积极参与,还要在课后多读、多练、多利用网络资源求助,并准备足够的草稿纸进行编程练习。 总的来说,大学软件...

    数据结构与算法java中文_草稿

    ### 数据结构与算法Java中文概览 #### Java与面向对象...以上内容概述了《数据结构与算法java中文》的主要知识点,涵盖了从编程基础到高级数据结构与算法的全面介绍,旨在为学习者提供系统化的理论指导和实践指南。

    草稿-webtransport-http2

    使用HTTP / 2的WebTransport 这是单个Internet草案“使用HTTP / 2的WebTransport”的工作区域... 建立草稿 可以使用make构建草稿的格式化文本和HTML版本。 $ make 这需要您安装必要的软件。 请参阅。 贡献 请参阅。

    发布文章 (七)-发表-存入草稿-Message 消息成功提示组件-$router.push跳转页面 & 合并修改文章业务-&&短路与的运算和if判断 async用法 post和put上传写法

    11-发布文章-发表&存入草稿 点击发表,点击存入草稿 把文章数据提交给后台 成功:提示+跳转内容管理 Message 消息提示组件-基础用法模式: https://element.eleme.cn/#/zh-CN/component/message publish/index.vue /...

    祖冲之算法相关文档

    #### 四、算法结构及工作原理 ##### 8.1 流密码祖冲之算法(ZUC) - **概述**:ZUC是一种非线性反馈移位寄存器(NLFSR)型的流密码算法。 - **密钥初始化**:通过初始向量(IV)和密钥(Key)对NLFSR进行初始化。 - **密钥...

    【已改】徐佳的草稿论文 -.zip

    【已改】徐佳的草稿论文 -.zip 这个压缩包文件的名称表明它包含的是徐佳的一份草稿论文。通常,草稿论文是作者在完成最终版本之前进行反复修改和完善的初步版本,因此我们可以预期这篇论文可能涵盖了某个特定的学术...

    使用Python创建快速创建剪映草稿轨道,自动生成视频

    自动生成草稿后,就可以自动剪辑了。 1. 添加一个媒体到轨道顺序 `草稿媒体库` -&gt; `内容媒体库`-&gt; `轨道片段` 2. `add_media_to_track` 会识别媒体类型,加入到对应轨道。 3. 当没有视频轨道时,创建音频轨道会先...

Global site tag (gtag.js) - Google Analytics