Prepare

笔试题

strcpy

二叉树的深度优先和广度优先遍历

1.strncpy

char *
strncpy(char *dest, const char *src, size_t n)
{
     size_t i;

     for (i = 0; i < n && src[i] != '\0'; i++)
          dest[i] = src[i];
     for ( ; i < n; i++)
          dest[i] = '\0';
     return dest;
}

2.strcpy

#include <stdio.h>
char* strcpy(char *strDest, const char* strSrc)
{
    char *p=NULL;
    if(strDest == NULL || strSrc == NULL)
    {
        return NULL;
    }
    p = strDest;
    while((*strDest++ = *strSrc ++) != '\0');
    return p;
}

int getStrLen(const char* str)
{
    int len = 0;
    while( *str ++ != '\0')
    {
        len ++;
    }
    return len;
}

3.打印值

#include <string.h>
#include <iostream>
using namespace std;
char str1[]       = "abc";
char str2[]       = "abc";
const char str3[]   = "abc"; 
const char str4[] = "abc"; 
const char* str5  = "abc";
const char* str6  = "abc";

int main(){

       cout << "boolalpha " << ( str1==str2 ) << endl;// 0 
       cout << "boolalpha " << ( str3==str4 ) << endl;// 0 
       cout << "boolalpha " << ( str5==str6 ) << endl;// 1 字符串常量指向同一个地址
       cout << "boolalpha " << ( 1==1 ) << endl; // 1
       return 0;
}
/*
 Str1,str2,str3,str4是数组变量,它们有各自的内存空间;
 字符数组作为局部变量被存储在栈区;
 而str5,str6,str7,str8是指针,它们指向相同的常量,"abc"被存储在静态数据区,而且是全局的.
*/

4.二叉树的深度优先和广度优先遍历

深度优先遍历:
对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.
要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历.
具体说明如下:
先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。


广度优先遍历:
又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一
层就进入下一层,直到没有结点可以访问为止.

5.什么函数不能声明为虚函数

构造函数不能声明为虚函数.

6.IP地址的编码分为哪俩部分

IP地址由两部分组成,网络号和主机号.
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位.

7.不能做switch()的参数类型是?

C/C++中:
支持byte,char,short,int,long,bool,整数类型和枚举类型.
不支持float,double,string.

Java中:
boolean类型,
String类型是java7开始支持.

8.非C++内建型类A 和 B,在哪几种情况下B能隐式转化为A?

a.class B : public A { ……} // B公有继承自A,可以是间接继承的
b.class B { operator A( ); } // B实现了隐式转化为A的转化
c.class A { A( const B& ); } // A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

9.将字符串中的小写字母转换成大写字母

 /**********************************************
* 题目:将字符串中的小写字母转换成大写字母
* 描述:输入一串字符串,将其中的小写字母都转成大写字母,
		字符串中可能有空格。 
* 作者:小韦同学 
* 邮箱:weichangying_wcy@163.com 
**********************************************/
#include <string>
#include <iostream>
using namespace std;
 int main() {
        	string str;
        	getline(cin, str);  
        	for (int i = 0; i < str.size(); i++) {
        		if ('a' <= str[i] && str[i] <= 'z') {  // 判断是否为小写字母 
        			str[i] = str[i] - ('a' - 'A');  // 转成大写字母 
        		}
        		cout << str[i];
        	} 	
        	return 0;
}

10.以下代码中的两个sizeof用法有问题吗

void UpperCase( char str[] )

{
    for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
          if( 'a'<=str[i] && str[i]<='z' )
             str[i] -= ('a'-'A' );
}
char str[] = "aBcDeyyyyyyy";
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;


/*
如果数组的长度大于机器对应的指针(代表着其寻址能力)所对应的长度,那么后序的就没有办法正常
转换大小写
*/

答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分
配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为11,函数内的str实际只是一个
指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针
为8个字节(64位的机器上),因此返回8.

编译的时候也会给警告:
‘sizeof’ on array function parameter ‘str’ will return size of ‘char*’

11.strlen&sizeof

strlen()【计算字符串的长度, 是一种函数,'\0’作为终止符】
strlen的结果运行的时候才出来(不是编译期求值),是计算字符串长度的,其参数必须是字符型指针(char*),头文件为#include<string.h>,


sizeof()【操作数所占空间的字节数大小,是一种c中的基本运算符】
可以以类型、指针、数组和函数等作为参数,返回值类型为unsigned int.
运算值在编译的时候就出结果,所以可以用来定义数组维数.


char a[5]="123";
int b=sizeof(a);//b=5
int c=strlen(a);//c=3

12.C字符用16进制表示

链接

将unsigned char字符串以16进制的字符串显示

13.atoi

atio的实现

14.sizeof<vecA>

#include <iostream>
#include <vector>
using namespace std;
int main(){
     vector<int> vecA;
     vector<double> vecB;
     vecA.push_back(1);
     vecA.push_back(2);
     vecB.push_back(1.000);
     cout << "sizeof(vecA) is " << sizeof(vecA) << endl; // 24
     cout << "sizeof(vecB) is " << sizeof(vecB) << endl; // 24
     return 0;

}

/*
 有一个说法是说vector需要三个指针,一个指向头,一个指向尾部,一个指向vecor的大小,
 但是这个还是要确认一下.
*/

15.关于vector的总结

【emplace_back】VS【push_back】

Linux下增长因子为2
Windows下增长银子为1.5

16.一个引用的写法引发的不确定

/* 面试官有点狡猾啊 */
#include <iostream>
using namespace std;
int main(){
   int a =10;
   int b = 20;
   int &r = a;
   cout << "r = " << r << endl;
   r = b;// ok 面试官写的,没有注意
  // &r = b ; // not ok 
   cout << "r = " << r << ", b = " << b << " a = " << a <<endl;

}

17.移动语义与右值引用

移动语义带来性能优化效果

location&read value

18.

char* p和char p[]的区别

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值