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进制表示
13.atoi
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的总结
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.移动语义与右值引用
18.