c语言面试题

本文详细剖析了C/C++面试中常见的编程题目,涵盖数组越界、库函数理解、内存操作、指针、逻辑判断等多个方面。通过分析多个示例试题,强调了扎实的基础知识、良好的编程习惯和深入理解的重要性,旨在帮助面试者提升对C/C++语言的理解和应用能力。
摘要由CSDN通过智能技术生成

C/C++ 程序设计员应聘常见面试笔试试题深入剖析

1.引言


  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<10; i++)

 {

  str1[i] = 'a';

 }

 strcpy( string, str1 );

}

  试题3


void test3(char* str1)

{

 char string[10];

 if( strlen( str1 ) <= 10 )

 {

  strcpy( string, str1 );

 }

}

  解答:


  试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;


  对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1[url=]内存[/url]起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;


  对试题3if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。


  剖析:


  考查对基本功的掌握:


  (1)字符串以’\0’结尾;


  (2)对数组越界把握的敏感度;


  (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:


  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’ );

}

  10


//为了实现链式操作,将目的地址返回,加3分!


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

{

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

 char *address = strDest; 

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

  return address;

}

  从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!


  (4)strlen的掌握,它没有包括字符串末尾的'\0'


  读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为: int strlen( const char *str ) //输入参数const


{

 assert( strt != NULL ); //断言字符串地址非0

 int len;

 while( (*str++) != '\0' ) 

 

  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( “%s”,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 );

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值