C语言笔试题-3

来源:互联网 发布:网络公会人数 编辑:程序博客网 时间:2024/06/11 21:46

第一题、求一个数有多少位1?
  int func ( x )
  {
  int countx = 0;
   while ( x )
   {
   countx ++;
  x = x&(x-1);
   }
   return countx;
  }
第二题、实现strcpy函数和strlen函数
char * strcpy( char *strDest, const char *strSrc )
{
 assert( (strDest != NULL) && (strSrc != NULL) );
 char *address = strDest;
 while( (*strDest++ = * strSrc++) != ‘\0’ );
  return address;
}

int strlen( const char *str ) //输入参数const
{
 assert( strt != NULL ); //断言字符串地址非0
 int len;
 while( (*str++) != '\0' )
 {
  len++;
 }
 return len;
}
试题4:为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
  解答:
  头文件中的编译宏
#ifndef __INCvxWorksh
#define __INCvxWorksh
#endif
  的作用是防止被重复引用。
  作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名
字与C语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y);
  该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。
  为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加
上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。
 
第五题

Char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");

输出结果是Got a valid pointer

第六题、下面输出什么?
#include <stdio.h>
#include <string.h>
int main()
{
 char *p1="name";
 char *p2;
 p2=(char*)malloc(20);
 memset (p2, 0, 20);
 while(*p2++ = *p1++);
 printf("%s \n",p2);
 return 0;
}
注意:p2移动后没返回到字符串首地址

原创粉丝点击