strlen函数以及string类使用心得

复习一下strlen函数

其实,给strlen函数之后它就会向下偏移统计个数,遇到当前位置字符为'\0'才会停下来。如果没有的话就有可能接着往下走下去,甚至会超过开辟空间的区域指向一片未开辟空间赋值的空间。

所以服务端这边接收的buffer要比需要接收的数据大小大一点才不会在strlen的时候出现问题,因为数组里面的数据都占满了,最后一个'\0'的位置没留下来,粗心大意。

函数原型

 

extern unsigned int strlen(char *s);

都说到strlen函数,其实和它相比有一个类似的叫sizeof的函数,这个函数是计算字节数的,和长度没啥关系了。而且,对于指针来说只能计算指针变量的大小,只有对于数组头(这个指针不一般)才会得到数组大小。当然要是把数组头传到函数里面,那么函数就会将它识别为一个普通的指针,肯定也不会得到你想要的数组大小什么的,而是4(32位)

string类的用法

最近总是用string类里面的函数,需要好好记录一下

其实string就是基于c语言里面的char类型的变量,其中加了一些对字符串的操作,也实现了迭代器什么的,平时用不上但是用的时候觉得也是真香。从官网上面给出的内部成员类型,就会发现其实迭代器,空间配置器都已经特化为char类型。

常用的几个函数

构造函数

string(); //默认构造 没啥好讲的
string (const string& str); //拷贝构造函数
string (const string& str, size_t pos, size_t len = npos);//拷贝局部子串 pos位置 len长度string (const char* s);//传一个数组进去
string (const char* s, size_t n);//数组加上长度
string (size_t n, char c);//长度 填充的字符
template <class InputIterator>  
string  (InputIterator first, InputIterator last); //迭代器。。。

其实按道理来说,构造过程应该就是这边会判断传递的指针是不是null,如果是null就会开辟一个字节的buf存一下'\0',然后,还有一个函数就是string::c_str()这个函数就传递const char *指向array的指针。但是,除了在构造函数里面不管是根据strlen计算字符串大小,然后开辟空间还是直接拷贝另一个string,只有这时候才会给string内部的指针开辟空间。所以对于一个string变量下面的做法是错误的

string str1;
memcpy(str1.c_str(),"Hello world!",12); //错误因为c_str没有开辟空间

1.find函数

第一个参数

  • 可以传一个string
  • 可以传一个char *(数组头,字符串都OK)
  • 可以传一个字符

第二个参数:

  pos 可以指定从什么位置开始查询

返回值:

  查不到返回的是std::string::npos 其实这个npos就在每个实例里面也可以str.npos

size_t find(const string& str,size_t pos = 0)const;
size_t find(const char *s,size_t pos = 0)const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;

2.substr函数 对字符进行切割

函数原型:

 

string substr (size_t pos = 0, size_t len = npos) const;

截取任意的长度的字符串类面的一段,之后再将这一段返回出来

pos是初始位置,默认是0,后面是长度,表示的是截取的字符串的大小。

一般是和find函数配合使用。

3.erase函数

string& erase (size_t pos = 0, size_t len = npos);//擦除字符串里面的一部分
iterator erase (iterator p);//擦除指定的迭代器位置的数据
iterator erase (iterator first, iterator last);//擦除两个迭代器之间的字符串

一般配合迭代器使用,适合擦除某一个字符串中不希望要的字符

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值