strlen和sizeof区别
- sizeof是运算符,不是函数,结果在编译的时候获得;参数可以是任何数据类型或者数据;
- strlen是字符处理的库函数;参数只能是==字符指针并且结尾是’\0’的字符串
一个指针占用内存大小和编译环境有关,而与机器位数无关。
string和char的区别
string继承自basic_string,其实是对char进行封装,包含了char数组,容量,长度等等属性。string可以进行动态扩展,每次扩展的时候另外申请一块原空间大小两倍的空间(2*n),然后将原来字符串拷贝过去,并且加上新增的内容。
string与const char*,char*之间的关系转换
a) string转const char*
string s = “abc”;
const char* c_s = s.c_str();
b) const char* 转string,直接赋值即可
const char* c_s = “abc”;
string s(c_s);
c) string 转char*
string s = “abc”;
char* c;
const int len = s.length();
c = new char[len+1];
strcpy(c,s.c_str());
d) char* 转string
char* c = “abc”;
string s(c);
e) const char* 转char*
const char* cpc = “abc”;
char* pc = new char[strlen(cpc)+1];
strcpy(pc,cpc);
f) char* 转const char*,直接赋值即可
char* pc = “abc”;
const char* cpc = pc;
strcpy、sprintf和memcpy区别
复制内容
strcpy只能复制字符串;sprintf源对象可以是多种数据类型,目标操作对象是字符串;memcpy可以复制任何内容
复制方法
strcpy不需要指定长度,遇到被复制字符串结束符"\0"的时候才结束,所以容易溢出;memcpy根据第三个参数决定复制的长度
用途
复制字符串的时候通常用strcpy;sprintf主要实现其它数据类型格式到字符串的转化;复制其它类型的时候一般使用memcpy
执行效率
memcpy最高;strcpy次之;sprintf最低
strcpy与strncpy函数的区别?哪个函数更安全?
函数原型
char* strcpy(char* strDest, const char* strSrc)
char *strncpy(char *dest, const char *src, size_t n)
安全问题
- strcpy函数: 如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。
- strncpy函数:用来复制源字符串的前n个字符,src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置n个字符。
strncpy目标长、指定长和原长的关系
- 如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上’\0’
- 如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括’\0’
- 如果指定长>目标长,运行时错误 ;
memset
用于将特定值填充到内存块中。
声明
void *memset(void *str, int c, size_t n)
- str:指向要填充的内存块
- c:要被设置的值。
- n:要被设置为该值的字符数
类成员函数里面memset(this,0,sizeof(*this))会发生什么?
类中含有虚函数表
这样做会破坏虚函数表,后续对于虚函数的调用会出现异常
类中含有C++类型的对象
由于在构造函数体的代码执行之前就对这个对象进行了初始化,假设对象在它的构造函数中分配了内存,那么使用memset之后会将对象的内存空间设为0,破坏了对象内存。