C++中有关于字符串的一些问题(strlen,sizeof,strcpy等)

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,破坏了对象内存。

猜你喜欢

转载自blog.csdn.net/qaaaaaaz/article/details/130734546