C/C++ 笔试、面试题目汇总1——代码相关

1.求下面函数的返回值( 微软)

int func(int x) 
{ 
    int countx =0; 

    while(x) 
    { 
        countx ++; 
        x = x&(x-1); 
    } 

    return countx; 
}
View Code

思路:将x转化为2进制,看含有的1的个数。

 

2. 下面关于“联合”的题目的输出?

a)

#include <stdio.h>
union
{
  int i;
  char x[2];
}a;

void main()
{
  a.x[0] =10; 
  a.x[1] =1;
  printf("%d",a.i);
}
View Code

 答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)

b)

int main() 
{ 
    union   /*定义一个联合*/ 
    { 
        int i;

        struct  /*在联合中定义一个结构*/ 
        { 
            char first; 
            char second; 
        }half; 
    }number;

    number.i=0x4241; /*联合成员赋值*/ 
    printf("%c%c\n", number.half.first, mumber.half.second); 
    number.half.first='a'; /*联合中结构成员赋值*/ 
    number.half.second='b'; 
    printf("%x\n",number.i); 
    getch(); 

    return 0;
} 
View Code

 答案: AB   (0x41对应'A',是低位;Ox42对应'B',是高位)

       6261 (number.i和number.half共用一块地址空间)

3. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

/*
编写strcpy函数(10分)
已知strcpy函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了 实现链式表达式。 // 2分
例如 int length = strlen( strcpy( strDest, “hello world”) );
*/

#include <assert.h>
char* strcpy(char*strDest, const char*strSrc)
{
    assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
    char *address = strDest;    // 2分

    while ((*strDest++=*strSrc++) !='\0')
        ;                       // 2分

    return address;             // 2分
}
View Code

  另外strlen函数如下:

#include<assert.h> 
int strlen( const char*str ) // 输入参数const
{
    assert( str != NULL ); // 断言字符串地址非0
    int len = 0;

    while( (*str++) !='\0' ) 
    { 
        len++; 
    } 

    return len;
}
View Code

 

4. 已知String类定义如下

class String
{
public:
  String(const char *str = NULL); // 通用构造函数
  String(const String &another); // 拷贝构造函数
  ~String(); // 析构函数
  String& operater =(const String &rhs); // 赋值函数
private:
  char* m_data; // 用于保存字符串
};
View Code

尝试写出类的成员实现。
答案:

#include <string.h>

#pragma warning(disable:4996)       // warning C4996: “strcpy”被声明为否决的

class String
{
public:
    String(const char *str = NULL); // 通用构造函数
    String(const String &another); // 拷贝构造函数
    ~String(); // 析构函数
    String& operator =(const String &rhs); // 赋值函数
private:
    char* m_data; // 用于保存字符串
};

String::String(const char *str)
{
    if (str == NULL)    // strlen在参数为NULL时会抛异常才会有这步判断
    {
        m_data = new char[1];
        m_data[0] = '\0';
    }
    else 
    {
        size_t size = strlen(str) + 1;

        m_data =new char[size];
        strcpy(m_data,str);
    }
}

String::String(const String &another)
{
    m_data =new char[strlen(another.m_data) +1];
    strcpy(m_data,another.m_data);

}

String& String::operator=(const String &rhs)
{
    if (this == &rhs)
        return *this;

    delete []m_data; //删除原来的数据,新开一块内存
    
    m_data =new char[strlen(rhs.m_data) +1];
    strcpy(m_data,rhs.m_data);

    return*this ;
}

String::~String()
{
    delete []m_data;
}
View Code

 

5. 引用相关知识

参见《引用相关知识总结》

 

参考资料: http://www.cnblogs.com/fangyukuan/archive/2010/09/18/1829871.html

 

转载于:https://www.cnblogs.com/wangzhijun/p/3154253.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值