设为首页 加入收藏

TOP

东软C_C++笔试(五)
2014-11-16 09:40:03 来源: 作者: 【 】 浏览:73
Tags:东软 C_C 笔试
o,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。
为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern “C”来解决名字匹配问题,函数声明前加上extern “C”后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。


试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”
函数头是这样的:
//pStr是指向以’\0′结尾的字符串的指针
//steps是要求移动的n
void LoopMove ( char * pStr, int steps )
{
  //请填充…
}
解答:
正确解答1:
Code
void LoopMove ( char *pStr, int steps )
{
  int n = strlen( pStr ) – steps;
  char tmp[MAX_LEN];
  strcpy ( tmp, pStr + n );
  strcpy ( tmp + steps, pStr);
  *( tmp + strlen ( pStr ) ) = ‘\0′;
  strcpy( pStr, tmp );
}


正确解答2:
Code
void LoopMove ( char *pStr, int steps )
{
  int n = strlen( pStr ) – steps;
  char tmp[MAX_LEN];
  memcpy( tmp, pStr + n, steps );
  memcpy(pStr + steps, pStr, n );
  memcpy(pStr, tmp, steps );
}


剖析:
这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。
最频繁被使用的库函数包括:
(1) strcpy
(2) memcpy
(3) memset
memcpy
  原型:extern void *memcpy(void *dest, void *src, unsigned int count);
  用法:#include
  功能:由src所指内存区域复制count个字节到dest所指内存区域。
  说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
  注意:与strcpy相比,memcpy并不是遇到’\0′就结束,而是一定会拷贝完n个字节。
  举例:
  // memcpy.c
  #include
  #include
  int main(int argc, char* argv[])
  {
  char *s=”Golden Global View”;
  char d[20];
  clrscr();
  memcpy(d,s,strlen(s));
  d[strlen(s)]=’\0′;
  printf(“%s”,d);
  getchar();
  return 0;
  }
  截取view
  #include
  int main(int argc, char* argv[])
  {
  char *s=”Golden Global View”;
  char d[20];
  memcpy(d,s+14,4);
  //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可
  d[4]=’\0′;
  printf(“%s”,d);
  getchar();
  return 0;
  }
  输出结果:
  View
  初始化数组
  char msg[10];
  memcpy(msg,0,sizeof(msg));


memset
函数原型
  void *memset(void *s, int ch, unsigned n);
编辑本段
程序例
  #include
  #include
  #include
  


memset函数
int main(void)
  {
  char buffer[] = “Hello world\n”;
  printf(“Buffer before memset: %s\n”, buffer);
  memset(buffer, ‘*’, strlen(buffer) );
  printf(“Buffer after memset: %s\n”, buffer);
  return 0;
  }
  输出结果:
  Buffer before memset: Hello world
  Buffer after memset: ***********
  编译平台:
  Microsoft Visual C++ 6.0
  也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样:
  int array[5] = {1,4,3,5,2};
  for(int i = 0; i < 5; i++)
  cout<   cout<   memset(array,0,5*sizeof(int));
  for(int k = 0; k < 5; k++)
  cout<   cout<   输出的结果就是:
  1 4 3 5 2
  0 0 0 0 0
  后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。
  
  要注意的是,memset是对字节进行操作,
  所以上述程序如果改为
  int array[5] = {1,4,3,5,2};
  for(int i = 0; i < 5; i++)
  cout<   cout<   memset(array,1,5*sizeof(int));// 注意 这里与上面的程序不同
  for(int k = 0; k < 5; k++)
  cout<   cout<   输出的结果就是:
  1 4 3 5 2
  16843009 16843009 16843009 16843009 16843009
  为什么呢?
  因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。
  所以用memset对非字符型数组赋初值是不可取的!
  例如有一个结构体Some x,可以这样清零:
  memset( &x, 0, sizeof(Some) );
  如果是一个结构体的数组Some x[10],可以这样:
  memset( x, 0, sizeof(Some)*10 );
编辑本段
memset函数详细说明
  1。void *memset(void *s,int c,size_t n)
  总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
  2。例子
  main(){
  char *s="Golden Global View";
  clrscr();
  memset(s,'G',6);//貌似这里有点问题// 单步运行到这里会提示内存访问冲突
  printf("%s",s);
  getchar();
  return 0;
  } 
  【应该是没有问题的,字符串指针一样可以,并不是只读内存,可以正常运行】
  3。memset() 函数常用于内存空间初始化。如:
  char str[100];
  memset(str,0,100);
  4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘memset(a, '\0', sizeof(a));
  memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:
  char a[100], b[50];
  memcpy(b, a, sizeof(b)); //注意如用sizeof(a),会造成b的内

首页 上一页 2 3 4 5 6 7 8 下一页 尾页 5/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇指针和引用的区别是什么? 下一篇Unix笔试题英文附带详细答案

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: