C程序员应聘常见面试题深入剖析由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c程序员面试题”。
C/C++ 程序设计员应聘常见面试试题深入剖析本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。
许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。
分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。
2.找错题
试题1:
以下是引用片段: 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
{
str1= ''a'';
}
strcpy(string, str1);
}
试题3:
以下是引用片段: void test3(char* str1)
{
char string[10];
if(strlen(str1)
{
strcpy(string, str1);
}
}
解答:
试题1字符串str1需要11个字节才能存放下(包括末尾的’ ’),而string只有10个字节的空间,strcpy会导致数组越界;
对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;
对试题3,if(strlen(str1)
剖析:
考查对基本功的掌握:
(1)字符串以’ ’结尾;
(2)对数组越界把握的敏感度;
(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
以下是引用片段:
void strcpy(char *strDest, char *strSrc)
{
while((*strDest++ = * strSrc++)!= ‘ ’);
}
4分
以下是引用片段:
void strcpy(char *strDest, const char *strSrc)
//将源字符串加const,表明其为输入参数,加2分
{
while((*strDest++ = * strSrc++)!= ‘ ’);
}
7分
以下是引用片段:
void strcpy(char *strDest, const char *strSrc)
{
//对源地址和目的地址加非0断言,加3分
aert((strDest!= NULL)&&(strSrc!= NULL));
while((*strDest++ = * strSrc++)!= ‘ ’);
}
10分
以下是引用片段:
//为了实现链式操作,将目的地址返回,加3分!
char * strcpy(char *strDest, const char *strSrc)
{
aert((strDest!= NULL)&&(strSrc!= NULL));
char *addre = strDest;
while((*strDest++ = * strSrc++)!= ‘ ’);
return addre;
} 从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!
(4)对strlen的掌握,它没有包括字符串末尾的'' ''。
读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为: int strlen(const char *str)//输入参数const
以下是引用片段:
{
aert(strt!= NULL);//断言字符串地址非0
int len;
while((*str++)!= '' '')
{
len++;
}
return len;
}
试题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);
...//省略的其它语句
}
解答:
试题4传入中GetMemory(char *p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
char *str = NULL;
GetMemory(str);
后的str仍然为NULL;
试题5中
char p[] = “hello world”;
return p;的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句 tiffanybracelets
*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)良好的动态内存申请和释放习惯。
再看看下面的一段程序有什么错误:
以下是引用片段: swap(int* p1,int* p2)
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Acce Violation”。该程序应该改为:
以下是引用片段:
swap(int* p1,int* p2)
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
一、#include #include #include #include using namespace std;int main(void){ static char s[] = “abce”;char *p = s;cout
输出结论: ac99 abce qrst bcd
为什么*p+2输出的是99,而不是c?
答:p的指针类型是char*, p保存s[0]的地址,因此*p指向s[0]的内容即‘a’,(p+2)指针指向了数组元素s[2]的地址,因此*(p + 2)将得到c,*p是char类型,2是int类型,char与int类型进行运算时,编译器会进行隐式转换,将char类型转换为int类型,因此将运算97+2,得出结果为99。
Q2:**t,这里的t还是不是一般意义上的存放的是一个内存地址,如果是地址它是数组首元素地址吗?这样看来好像不对,那它是怎么对应内存地址的?是对应一块内存地址吗? 答:t本向指向一个字符数组的首地址,所定义的这个字符数组是三维的,即2*3*5的字符数组,第一维的一组值为:“abcd”,“efgh”,“ijkl”, 第二维的一组值:“mnop”,“qrst”,“uvwx” **t指向第一维的第一组值:即“abcd”
static char t[][3][5] = {“abcd”,“efgh”,“ijkl”,“mnop”,“qrst”,“uvwx”};
cout
二、C语言中数组指针和指针数组彻底分析
1、简单知识
----------指针----------int a = 10;int p = &a;——p中存放的是a 的地址----------指针的指针----------int b = 20;int *p = &b;int *p2p =&p;----------简单数组----------int c[10];//整数数组,含有10个整数元素
file://也就是说每个元素都是整数----------指针数组----------int *p[10];//指针数组,含有10个指针元素
file://也就是说每个元素都是指针----------数组指针--------int(*p)[10];//数组指针,这个指针可以用来指向
file://含有10个元素的整数数组
上面这些简单的形式是我们必须要首先理解,这个是基本的知识。同时我们从上面也要得出一个很重要的知识提示:C语言层面上关于变量声明的部分,后缀结合变量的优先级比前缀要高。
2、提高知识 先看一段程序: #include #include using namespace std;
int main(){ int vInt=10;int arr[2]={10,20};int *p=&vInt;int **p2p=&p;
int *parr[2]={&vInt,&vInt};int(*p2arr)[2]=&arr;
cout
return 0;}
打印结果:
运行的结果如下:(我在前面加了行号#XX)#01Declaration[intvInt=10]type==int #02Declaration[arr[2]={10,20}]type==int* #03Declaration[int*p=&vInt]type==int* #04Declaration[int**p2p=&p]type==int** #05Declaration[int*parr[2]={&vInt,&vInt}]type==int** #06Declaration[int(*p2arr)[2]=&arr]type==int(*)[2]
结果分析:
----------#02:数组--------在编译器看来数组只是相对应类型的指针类型。当我们把数组传递给函数作为参数的时候,传递的是指针,所以我们可以利用参数来修改数组元素。这个转化是编译器自动完成的。
----------#05:指针数组----------指针数组在编译器内部表示也是对应类型的指针
----------#06: 数组指针----------数组指针在编译器内部内部表示就是有一点特别了。编译器(或者说是语言本身)有数组指针这个内部表示。
由于c语言的类型严格检查的语言(当然还有一些是存在隐式类型转化的)
C/C++ 程序设计员应聘常见面试试题深入剖析本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题......
1.引言 本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见-。许多面试......
C/C++程序员应聘常见面试题一.找错题试题1: void test1() { char string[10]; char* str1 = "0123456789"; strcpy( string, str1 ); }试题2: void test2() { char strin......
为了提高用户体验度,现如今的互联网企业在网页设计及制作上提出了更高的要求。在大环境的影响下,对于应聘网站美工的求职者来说,想要在诸多竞争中赢得用人单位的亲睐,在面试前就......
程序员面试题2015不少程序员都会碰到的三个面试题1.求从10到100中能被3或5整除的数的和 2.将一个字符串逆序,不要使用反转函数 3.反转一个栈 问题解决的步骤和错误: 1.解析问......