用户名:
密码:
类型:
注册
 设为首页   加入收藏   联系我们
 
 
 
环渤海建材网

招聘企业

招聘职位

日期
唐山鑫淼金 电工兼职IT 2013/3/30
唐山创元教 网站推广 2013/2/17
唐山创元教 网站编辑 2013/2/17
唐山瑞津酒 酒店实习生 2012/12/14
哈尔滨哈飞 钳工 2012/8/20
劳联环球国 诚聘装配工 2012/8/4
滦县友朋汽 汽车维修技师 2012/7/15
河北元道通 移动基站维护 2012/6/26
唐山水峰商 店面销售 2012/6/19
      您的位置:唐山技校网>> 精选题库 >>IT公司笔试题总结(二)——北大青鸟


IT公司笔试题总结(二)——北大青鸟

已阅[3375]次[2012/10/17]

      北大青鸟为你总结了一些IT公司笔试题

  1. 找错

  试题1:

  Void test1()
  {
  char string[10];
  char* str1="0123456789";
  strcpy(string, str1);
  }

  试题2:

  Void test2()
  {
  char string[10], str1[10];
  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);
  }
  }

  在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:

  解答:
  test1: 字符串str1需要11个字节才能存放下(包括末尾的'\0'),而string只有10个字节的空间,strcpy会导致数组越界

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

  test3: if(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;
  }
  (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( 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中执行申请内存及赋值语句
  *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( int* p1,int* p2 )
  {
  int p;
  p = *p1;
  *p1 = *p2;
  *p2 = p;
  }

  2. 内功题

  试题1:分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)

  解答:

  BOOL型变量:if(!var)
  int型变量: if(var==0)
  float型变量:const float EPSINON = 0.00001;   if ((x >= - EPSINON) && (x <= EPSINON)
  指针变量: if(var==NULL)

  剖析:

  考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。

  一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变 量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL), 这是一种很好的编程习惯。

  浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。

  试题2:以下为Windows NT下的32位C++程序,请计算sizeof的值

  void Func ( char str[100] )
  {
  sizeof( str ) = ?
  }
  void *p = malloc( 100 );
  sizeof ( p ) = ?

  解答:

  sizeof( str ) = 4
  sizeof ( p ) = 4

  剖析:

  Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

  数组名的本质如下:

  (1) 数组名指代一种数据结构,这种数据结构就是数组;

  例如:

  char str[10];
  cout << sizeof(str) << endl;

  输出结果为10,str指代数据结构char[10]。

  (2) 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;

  char str[10];
  str++; //编译出错,提示str不是左值

  (3) 数组名作为函数形参时,沦为普通指针。

  Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。


  学校地址:唐山市路北区华北煤炭医学院西校区篮球场以南,北大青鸟(唐山弘基)授权培训中心。

  乘车路线:市内乘7、16、61、41、114、35、77路等建设路沿线公交车均可到达,煤医道口站下车

  联系电话:15132527389   13832811994

  联系QQ:736798197


关键词:唐山,北大青鸟,IT



 上一条:东波威娜——秋季美白4招 下一条:IT公司笔试题总结(一)——北大青鸟

相关信息

·唐山北大青鸟学校怎么样?

·唐山北大青鸟学校报名条件是什么?

·唐山北大青鸟学校的地址在哪?乘车路线?招生电话多少?

·唐山北大青鸟网络工程师4大就业优势

·北大青鸟让你学习零无忧

更多 精选题库

技校 | 关于技校网 | 技校网广告服务| 技校网汇款信息 | 技校网会员服务 | 技校网免责声明 |
CopyRight 2009-2010 All rights reserved 版权所有 唐山创元教育咨询有限公司 未经允许 请勿复制或镜像 技校网备案序号: 冀ICP备11020808号-5 冀公网安备 13024002000223号
电话:400-808-8566 传真:0315-3859044
400-8088-566 0315-3859044 工作日:8:00-21:30
周六日:8:00-21:30