51CTO下载-C程序员面试题

更新时间:2023-07-27 16:43:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

挺好的 程序员可以用哈

一:推理题。

1、 一个大院子里住了50户人家,每家都养了一条狗,有一天他们接到通知说院子里有狗生病了,并要求所有主人在发现自己家狗生病的当天就要把狗枪杀掉。然而所有主人和他们的狗都不能够离开自己的房子,主人与主人之间也不能通过任何方式进行沟通,他们能做的只是通过窗户观察别人家的狗是否生病从而判断自己的狗病否。(就是说,每个主人只能看出其他49家的狗是不是生病,单独看自己的狗是看不出来的)

第一天没有枪声,第二天还是没有枪声,第三天传出一阵枪声,问有多少条狗被枪杀。

2、有四个人(A,B,C和D)要在一个月黑风高的夜里过一个很长的独木桥。桥只能一次乘载两个人,就是说每次最多两人同时过桥。过桥要用手电筒,而这四个人只有一只手电筒,也就是说两人共用这只手电筒过桥后,其中一人必须带着手电筒返回(没有其他方法),否则其他人就不能再过了。这四个人由于年龄和身体状况的差异,每个人过桥所需要的时间不同:A需要1分钟,B需要2分钟,C需要5分钟,D需要10分钟。由于共用一只手电筒的原因,当两人一同过桥时,过桥的时间是以其中慢的一人为准,比如A和C一起过桥要用5分钟。

现在问:要所有人过桥,最短要多少分钟,如何安排他们的过桥顺序?

二:编程题

1,

用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。

2

用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。

3

用两个栈实现一个队列的功能?要求给出算法和思路!

4

已知链表的头结点head,写一个函数把这个链表逆序 void reverse(node*& head)

5

写一个函数找出一个整数数组中,第二大的数 int find_sec_max( int data[] , int count)

挺好的 程序员可以用哈

已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

三:找错题

11

void test1()

{

char string[10];

char* str1 = "0123456789";

strcpy( string, str1 );

}

2:

void test2()

{

char string[10], str1[10];

int i;

for(i=0; i<10; i++)

{

str1[i] = 'a';

}

strcpy( string, str1 );

}

3:

void test3(char* str1)

{

char string[10];

if( strlen( str1 ) <= 10 )

{

strcpy( string, str1 );

}

}

试题4:

void GetMemory( char *p )

{

p = (char *) malloc( 100 );

}

挺好的 程序员可以用哈

void Test( void )

{

char *str = NULL;

GetMemory( str );

strcpy( str, "hello world" );

printf( str );

}

试题5:

char *GetMemory( void )

{

char p[] = "hello world";

return p;

}

void Test( void )

{

char *str = NULL;

str = GetMemory();

printf( str );

}

试题6:

void GetMemory( char **p, int num )

{

*p = (char *) malloc( num );

}

void Test( void )

{

char *str = NULL;

GetMemory( &str, 100 );

strcpy( str, "hello" );

printf( str );

}

试题7:

void Test( void )

{

char *str = (char *) malloc( 100 );

strcpy( str, "hello" );

free( str );

... //省略的其它语句

挺好的 程序员可以用哈

}

编程题

答案1

char *revert(char * str)

{

int n=strlen(str);

int i=0;

char c;

for(i=0;i

{

c=str;

str=str[n-i];

str[n-i]=c;

}

return str;

}

答案2

void * memmove(void *dest,const void *src,size_t n)

{

assert((dest!=0)&&(src!=0));

char * temp=(char * )dest;

char * ss=(char * )src;

int i=0;

for(;i{

*temp++=*ss++;

}

return temp;

}

答案3

设2个栈为A,B, 一开始均为空.

入队:

将新元素push入栈A;

出队:

挺好的 程序员可以用哈

1将栈A中所有元素依次pop出并push到栈B;

2将栈B的栈顶元素pop出;

答案4

void reverse(node*& head)

{

if ( (head == 0) || (head->next == 0) ) return;// 边界检测

node* pNext = 0;

node* pPrev = head;// 保存链表头节点

node* pCur = head->next;// 获取当前节点

while (pCur != 0)

{

pNext = pCur->next;// 将下一个节点保存下来

pCur->next = pPrev;// 将当前节点的下一节点置为前节点

pPrev = pCur;// 将当前节点保存为前一节点

pCur = pNext;// 将当前节点置为下一节点

}

}

链表正常的顺序是前一个节点的NEXT指向后一个节点。反转就是要将后一个节点的next指向前一个节点所以pCur->next = pprev; 完成了这一个功能。但这只是完成了两个节点的反转,所以对应的要将当前

节点的next保存下来pNext = pcur->next;,用来当作下一次的当前节点PCur = Pnext;在下一次反转中,当前节点就变成了下一次反转中的前节点。pPrev = pCur;一直到当前节点为NULL,也就是全部转化为止;

6

char *strcpy(char *strDest, const char *strSrc)

{

if ( strDest == NULL || strSrc == NULL)

return NULL ;

if ( strDest == strSrc)

return strDest ;

char *tempptr = strDest ;

while( (*strDest++ = *strSrc++) != ‘/0’)

;

return tempptr ;

}

挺好的 程序员可以用哈

2 分

void strcpy( char *strDest, char *strSrc )

{

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

4 分

void strcpy( char *strDest, const char *strSrc )

//将源字符串加const,表明其为输入参数,加2 分

{

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

7 分

void strcpy(char *strDest, const char *strSrc)

{

//对源地址和目的地址加非0 断言,加3 分

assert( (strDest != NULL) && (strSrc != NULL) );

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

找错题答案:

试题4 传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改

变传入形参的值,执行完

char *str = NULL;

GetMemory( str );

后的str 仍然为NULL;

试题5 中

char p[] = "hello world";

return p;

的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,

其根源在于不理解变量的生存期。

试题6 的GetMemory 避免了试题4 的问题,传入GetMemory 的参数为字符串指针的指针,但是在

GetMemory 中执行申请内存及赋值语句

*p = (char *) malloc( num );

挺好的 程序员可以用哈

后未判断内存是否申请成功,应加上:

if ( *p == NULL )

{

...//进行申请内存失败处理

}

试题7 存在与试题6 同样的问题,在执行

char *str = (char *) malloc(100);

后未进行内存是否申请成功的判断;另外,在free(str)后未置str 为空,导致可能变成一个“野”指

针,应加上:

str = NULL;

试题6 的Test 函数中也未对malloc 的内存进行释放。

剖析:

试题4~7 考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中50~60 的

错误。但是要完全解答正确,却也绝非易事。

对内存操作的考查主要集中在:

(1)指针的理解;

(2)变量的生存期及作用范围;

(3)良好的动态内存申请和释放习惯。

本文来源:https://www.bwwdw.com/article/jmjm.html

Top