当前位置: 首页 > news >正文

如何用c语言做钓鱼网站网站qq弹窗代码

如何用c语言做钓鱼网站,网站qq弹窗代码,织梦网站怎么做索引地图,wordpress 商城#x1f525;博客主页#xff1a;小王又困了 #x1f4da;系列专栏#xff1a;C #x1f31f;人之为学#xff0c;不日近则日退 ❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 #x1f4d2;2.1构造函数 #x1f4d2;2.… 博客主页小王又困了 系列专栏C 人之为学不日近则日退 ❤️感谢大家点赞收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 2.1构造函数 2.2析构函数 2.3拷贝构造 2.4赋值重载 三、容量操作 3.1获取有效字符长度 3.2获取对象空间大小 3.3使用reserve扩容 四、字符串的遍历 4.1下标访问 4.2迭代器访问 五、修改操作 5.1尾插字符 5.2尾插字符串 5.3任意位置插入字符 5.4任意位置插入字符串 5.5重载 六、其他操作 6.1删除操作 6.2查找操作 6.3交换操作 6.4获取字符串 6.5运算符重载 6.6清理字符串 6.7流操作 ️前言 在上一篇中我们对string类进行了简单的介绍介绍了各个接口的作用和使用方法今天我们将为大家介绍string常用接口的模拟实现。 一、存储结构 string本质上是一个char类型的顺序表所以结构上和顺序表类似。 namespace bit {class string{public:private:char* _str;size_t _size;size_t _capacity;const static size_t npos;}; } 结构上使用命名空间 bit 进行封装防止与库冲突,其中 _str 指向存放字符串存空间的指针_size 表示当前所存储的有效字符个数_capacity 表示当前可存储的最大容量nops此值设置为 -1无符号整型转换就是42亿且此值为const和静态参数具有全局效应这个值常常被用来当作循环结束判断条件和查找时未找到的标志某些函数设置其为缺省参数。 nops的初始化 #includestring.hnamespace bit {const size_t string::nops -1; } 小Tips我们使用声明与定义分离实现nops只能在CPP文件中定义因为类里面的静态成员变量相当于全局变量在.h文件中定义会出现链接错误。我们还要通过类名::成员(函数/变量) 定义和实现函数 ​ 二、默认成员函数 2.1构造函数 string.h string(const char* str ); //给缺省值 构造空串string.cpp string::string(const char* str):_size(strlen(str)) {_str new char[_size 1];_capacity _size;strcpy(_str, str); } 构造函数的思路 构造函数可以接收字符串如果没有参数默认构造一个空串通过strlen先计算出字符串的长度并通过初始化列表初始化_size使用new开辟空间这里我们要多开一个空间存放‘\0’最终将字符串中的字符拷贝到我们所开的空间中 小Tips因为_size的大小没有包含‘\0’所以我们要多开辟一个空间。 2.2析构函数 我们开辟内存是使用 new[ ] 申请的所以对应使用 delete[ ]释放。 string::~string() {delete[] _str;_str nullptr;_size _capacity 0; } 2.3拷贝构造 拷贝构造函数如果我们不写编译器会默认生成一个但是默认生成的拷贝构造函数只支持浅拷贝新构造的对象只是拷贝了_str的指针地址两个对象都指向同一块空间最终两个对象析构时释放同一片空间的资源势必会导致程序崩溃 ​ 我们需要新构造的对象通过拷贝构造开辟一片新的空间将数据复制过去也就是深拷贝需要我们自己写一个拷贝构造。 传统写法 string::string(const string s) {_str new char[s._size 1];strcpy(_str, s._str);_size s._size;_capacity s._capacity; } 现代写法 string::string(const string s) {string tmp(s._str);swap(tmp); } //string s2(s1);  通过复用构造函数构造出tmp对象在将两个对象进行交换就可以实现拷贝构造。 2.4赋值重载 赋值重载需要注意自己给自己赋值这种冗余的行为同时也要控制空间大小 传统写法 string string::operator(const string s) {if(this ! s){char* tmp new char[s._size 1];strcpy(tmp, s._str);delete[] _str;_str tmp;_size s._size;_capacity s._capacity;}return *this; } 现代写法 string string::operator(const string s) {if (this ! s){string tmp(s._str);swap(tmp);}return *this; }string string::operator(string tmp) {swap(tmp);return *this; } 三、容量操作 3.1获取有效字符长度 size_t string::size() const {return _size; }小Tips 这个函数比较小可以写在类中形成内联函数。 对于不涉及对字符串的增删查改的函数使用const修饰this增强安全性。 3.2获取对象空间大小 与size函数规则一致。 size_t string::capacity() const {return _capacity; }3.3使用reserve扩容 void string::reserve(size_t n) {char* tmp new char[n 1];strcpy(tmp, _str); //将原字符串的数据拷贝到新空间上delete[] _str; //释放原字符串的空间_str tmp;_capacity n; } 四、字符串的遍历 4.1下标访问 下标访问是通过重载 [ ] 运算符实现的在下标pos正确的情况下返回当前下标字符的引用否则assert报错。 char string::operator[](size_t pos) {assert(pos _size);return _str[pos]; } 4.2迭代器访问 现在我们可以简单认为迭代器是指针对象就是对指针的封装。 //迭代器的声明 typedef char* iterator; typedef const char* const_iterator; //对数据无法修改 迭代器的begin返回字符串的地址end返回字符串末端的下一个即‘\0’。 string::iterator string::begin() {return _str; }string::iterator string::end() {return _str _size; }string::const_iterator string::begin()const {return _str; }string::const_iterator string::end()const {return _str _size; }五、修改操作 5.1尾插字符 在插入字符前先要判断是否需要扩容。 void string::push_back(char ch) {if (_size _capacity){size_t newcapacity _capacity 0 ? 4: _capacity * 2;reserve(newcapacity);}_str[_size] ch;_str[_size 1] \0;_size; } 5.2尾插字符串 void string::append(char* s) {size_t len strlen(s);if (_size len _capacity){reserve(_size len);}strcpy(_str _size, s);_size len; } 5.3任意位置插入字符 我们要考虑头插的位置end和pos的类型都是size_t代码会陷入死循环这里我们提供两种解决方法。 方法一         将end的类型定为int同时将pos强转为int型。 void string::insert(size_t pos, char ch) {assert(pos _size);if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : _capacity * 2;reserve(newcapacity);}int end _size;while (end (int)pos){_str[end 1] _str[end];--end;}_str[pos] ch;_size; } ​ 方法二         将end定位到‘\0’的下一位。 void string::insert(size_t pos, char ch) {assert(pos _size);if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : _capacity * 2;reserve(newcapacity);}size_t end _size 1;while (end pos){_str[end] _str[end - 1];--end;}_str[pos] ch;_size; } ​ 我们可以通过复用来实现尾插 void string::push_back(char ch) {insert(_size, ch); } 5.4任意位置插入字符串 void string::insert(size_t pos, const char* s) {assert(pos _size);size_t len strlen(s);if (_size len _capacity){reserve(_size len);}//方法一//int end _size;//while (end (int)pos )//{// _str[end len] _str[end];// --end;//}//方法二size_t end _sizelen;while (end poslen-1){_str[end] _str[end - len];--end;} memcpy(_str pos, s, len);_size len; } 我们也可以通过复用来实现尾插字符串 void string::append(const char* str) {insert(_size, str); } 5.5重载 运算符可以在当前字符串尾部追加字符或字符串我们可以通过复用push_back和append函数来实现。 //追加字符 string string::operator(char ch) {push_back(ch);return *this; }//追加字符串 string string::operator(const char* str) {append(str);return *this; } 六、其他操作 6.1删除操作 erase从pos下标开始删除len个字符其中len是一个缺省参数默认是npos。如果没有传值或len超过从pos位置开始到字符串尾部的字符个数则默认从pos位置开始删除后面的所有字符且不允许在空串的情况下进行删除 void string::erase(size_t pos, size_t len) {assert(pos _size);if (len _size - pos){_str[pos] \0;_size pos;}else{strcpy(_str pos, _str pos len);_size - len;} } 6.2查找操作 查找函数是find是从pos位置开始查找可以查找一个字符或一个子串查找到后字符返回下标字符串返回首字符的地址如果有多个重复的字符或字符串返回查找到的第一个字符的下标或字符串首的下标如果没找到则返回npos。 查找一个字符 size_t string::find(char ch, size_t pos) {for (size_t i pos; i _size; i){if (_str[i] ch)return i;}return npos; } 查找一个子串 size_t string::find(const char* str, size_t pos ) {char* p strstr(_str pos, str);return p - _str; } 6.3交换操作 void string::swap(string s) {std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capaicty, s._capaicty); }6.4获取字符串 string string::substr(size_t pos, size_t len) {assert(pos _size);if (len _size - pos){string sub(_str pos);return sub;}else{string sub;sub.reserve(len);for (size_t i 0; i len; i){sub _str[pos i];}return sub;} } 6.5运算符重载 逻辑判断运算符只需要实现两个其余的通过复用就可以全部实现。  bool string::operator(const string s) const {return strcmp(_str, s._str) 0; }bool string::operator(const string s) const {return !(*this s); }bool string::operator(const string s) const {return *this s || *this s; }bool string::operator(const string s) const {return !(*this s); }bool string::operator(const string s) const {return strcmp(_str, s._str) 0; }bool string::operator!(const string s) const {return !(*this s); } 6.6清理字符串 clear函数支持清空一个字符串但不是释放对象区别于析构函数。clear函数清理字符串并不会引起缩容只是在下标0位置置为 \0 _size置为0即可。 void string::clear() {_str[0] \0;_size 0; } 6.7流操作 流操作属于iostream中的对象所以不需要定义在类中作为成员函数也不需要声明为友元因为使用流体去和流插入需要ostream和istream对象作为左操作参数。 流插入 ostream operator (ostream os, const string str) {for (size_t i 0; i str.size(); i){os str[i];}return os; }流提取 istream Mystring::operator(istream in, string s) {s.clear(); char buff[256] {0}; char ch in.get(); size_t sub 0; while (ch ! ch ! \n) //当缓冲区中有空格和换行就结束提取{buff[sub] ch; if (sub 255) {buff[sub] \0; s buff; sub 0; }ch in.get(); }if (sub ! 0) {buff[sub] \0; s buff;}return is; }小Tips我们定义一个缓冲区buff先将字符串输入到缓冲区中如果字符串很长则分批写入string字符串中每次写入string后就刷新缓冲区再继续接收这样就避免了频繁开辟空间。 结语  本次的内容到这里就结束啦。希望大家阅读完可以有所收获同时也感谢各位读者三连支持。文章有问题可以在评论区留言博主一定认真认真修改以后写出更好的文章。你们的支持就是博主最大的动力。
http://www.hkea.cn/news/14526787/

相关文章:

  • 印刷报价网站源码珠海网站建设 amp 超凡科技
  • 外贸网站装修书城网站开发
  • 怎么做网站访问截取ip教做软件的网站
  • pc网站建设意见火车头采集器wordpress下载
  • 广州企业网站设计上海有哪几家做新房的网站
  • 南山网站建设深圳信科优化网站平台
  • 网站模板html5营销培训计划
  • 修改散文网站wordpress新建404页面
  • 网站首页设计过程查找网站注册时间
  • 苏州网站建设新手网站是自己做还是让别人仿
  • 个人网站有商业内容备案长沙高端网站建设品牌
  • wordpress中的角色优化网站公司外包
  • 体检中心 网站建设方案贵阳建设厅网站
  • 网站建设设计报价网站管理登录
  • 自定义网站建站公司南京公司网站建设费用
  • 桂林市网站设计wordpress宗旨是什么
  • wordpress网站不显示系列宁波专业网站搭建地址
  • 医药类网站建设评价手机端网站建设哪家好
  • 新东方广州门户网站网站线下推广方式
  • 中国建设银行的网站首页网站维护需要关闭网站么
  • 宁波网站推广优化中企动力科技股份有限公司成都分公司
  • 北京网站建设公司网络营销外包网络建站报价重庆网站建设哪个好
  • 关键词优化软件排行seo技术培训教程
  • 合肥市公司网站建设网站后台权限管理
  • 南京建设工程质量监督站网站阳江市房产网
  • 网站官网现在建设的网站有什么劣势
  • 建设网站制作公司淘宝客网站搭建
  • 宣武富阳网站建设网站建设网络宣传
  • 网站建设执行力网站模块图
  • php网站怎么样鄂尔多斯市住房和城乡建设厅网站