simulate std string
来源:互联网 发布:软件著作权许可使用 编辑:程序博客网 时间:2024/06/15 20:24
w(゚Д゚)w
C++就没有短的代码
改到哭
Description:
Implement the class String with given header, you can also make it like std::string!member function ‘compare()’ returns -1 for <, 0 for ==, 1 for >.
Any question see STL references.
more imformation just see the test.
String.h:
#ifndef SSCPP2014_STRING_H#define SSCPP2014_STRING_H#include <iostream>class String { private: char *_buff; int _length, _size; // _size is of the allocated memory public: // constructors String(); explicit String(const char *src); String(const String &src); // destructor ~String(); // member methods void assign(const char *src); void append(const char &other); void clear(); int compare(const String &other) const; const char* c_str() const; bool empty() const; int find(const String &other, int pos = 0) const; int length() const; String substr(const int &pos, const int &count) const; // overload operators char& operator[](const int &index); void operator=(const String &other); void operator=(const char *src); String operator+(const String &other) const; bool operator<(const String &other) const; bool operator<=(const String &other) const; bool operator>(const String &other) const; bool operator>=(const String &other) const; bool operator==(const String &other) const; bool operator!=(const String &other) const; // friend methods friend std::ostream& operator<<(std::ostream& out, const String &str); // non-meaning static property static char _error_sign; // initial as any char is okay};#endif
String.cpp
#include "String.h"#include<iostream>#include<cstring>using namespace std;String::String() { _buff = NULL; _length = _size = 0;}String::String(const char *src) { _size = strlen(src) + 1; _buff = new char[_size]; memset(_buff, 0, _size); snprintf(_buff, _size, "%s", src); _length = strlen(_buff);}String::String(const String &src) { _size = src._size; _length = src._length; _buff = new char[_size]; memset(_buff, 0, _size); snprintf(_buff, _size, "%s", src._buff);}String::~String() { delete [] _buff;}void String::assign(const char *src) { this->clear(); _size = strlen(src) + 1; _buff = new char[_size]; memset(_buff, 0, _size); snprintf(_buff, _size, "%s", src); _length = strlen(_buff);}void String::append(const char &other) { if (this->empty()) { this->assign("o"); _buff[0] = other; } else { if (_length + 1 < _size) { _buff[_length] = other; _length++; } else { _size = _size * 2; char* o_buff = new char[_size]; memset(o_buff, 0, _size); snprintf(o_buff, _size, "%s", _buff); delete[] _buff; _buff = o_buff; _buff[_length] = other; _length++; } }}void String::clear() { if (_buff) { delete [] _buff; _buff = NULL; } _length = _size = 0;}int String::compare(const String &other) const { int min = _length < other._length ? _length : other._length; for (int i = 0; i < min; i++) { if (_buff[i] < other._buff[i]) { return -1; } else if (_buff[i] > other._buff[i]) { return 1; } } if (_length < other._length) { return -1; } else if (_length > other._length) { return 1; } else { return 0; }}const char* String::c_str() const { return _buff;}bool String::empty() const { if (_length == 0) { return true; } else { return false; }}int String::find(const String &other, int pos) const { if (other.empty()) return -1; int count = 0; for (int i = 0; i < _length; i++) { if (_buff[i] == other._buff[0]) { for (int j = 0; j < other._length; j++) { if (_buff[i + j] == other._buff[pos + j]) count++; } if (count == other._length) return i; count = 0; // 因为漏了这个改了5、6次/(ㄒoㄒ)/~~ } } return _length;}int String::length() const { return _length;}String String::substr(const int &pos, const int &count) const { String temp; if (pos >= _length || pos + count > _length) return temp; temp._size = count + 1; temp._buff = new char[temp._size]; memset(temp._buff, 0, temp._size); snprintf(temp._buff, temp._size, "%s", _buff + pos); temp._length = strlen(temp._buff); return temp;}char& String::operator[](const int &index) { if (index >= 0 && index < _length) { return _buff[index]; } else { return _error_sign; }}void String::operator=(const String &other) { this->assign(other._buff);}void String::operator=(const char *src) { this->assign(src);}String String::operator+(const String &other) const { String temp; temp._size = this->_length + other._length + 1; temp._buff = new char[temp._size]; snprintf(temp._buff, _size, "%s", _buff); snprintf(temp._buff + _length, other._size, "%s", other._buff); temp._length = strlen(_buff); return temp;}bool String::operator<(const String &other) const { return this->compare(other) == -1 ? true : false;}bool String::operator<=(const String &other) const { return this->compare(other) == 1 ? false : true;}bool String::operator>(const String &other) const { return this->compare(other) == 1 ? true : false;}bool String::operator>=(const String &other) const { return this->compare(other) == -1 ? false : true;}bool String::operator==(const String &other) const { return this->compare(other) == 0 ? true : false;}bool String::operator!=(const String &other) const { return this->compare(other) == 0 ? false : true;}std::ostream& operator<<(std::ostream& out, const String &str) { for (int i = 0; i < str._length; i++) { out << str._buff[i]; } return out;}char String::_error_sign = '\0';
String Test.cpp
#include <iostream>#include <cstring>#include "String.h"#include <string>using namespace std;String a, b("MFGZ!");String c = b;void display() { cout << a.empty() << " " << a.length() << " " << a << endl; cout << b.empty() << " " << b.length() << " " << b << endl; cout << c.empty() << " " << c.length() << " " << c << endl;}int main() { string aa, bb, cc; display(); c[0] = 'K'; display(); cin >> aa >> cc; a.assign(aa.c_str()); c.assign(cc.c_str()); display(); b.clear(); display(); for (int i = 0 ; i < 10; ++i) { char t; cin >> t; a.append(t); b.append(t); c.append(t); } display(); b = c; display(); b = a + c; display(); cout << a.find(String("1993")) << endl; cout << b.find(String("HYOUKA")) << endl; cout << c.find(String("RIKKA")) << endl; cout << a.substr(0, 3) << endl; cout << b.substr(3, 8) << endl; cout << c.substr(6, 1) << endl; cout << (a > b) << (a >= b) << (a < b) << (a <= b) << (a == b) << endl; cout << a.compare(b) << b.compare(a) << endl; cout << (a > c) << (a >= c) << (a < c) << (a <= c) << (a == c) << endl; cout << a.compare(c) << c.compare(a) << endl; b = a; cout << (a > b) << (a >= b) << (a < b) << (a <= b) << (a == b) << endl; cout << a.compare(b) << b.compare(a) << endl; cout << a.compare(a) << endl; return 0;}
0 0
- simulate std string
- std::string
- std::string
- std::string
- std::string
- std::string
- std::string
- std::string
- std::string
- std::string
- std - string
- std::string
- std::string
- std::string
- std::string
- std::string
- std::string
- std::string
- Qt QImage与OpenCV Mat转换
- C++实验2-标准体重
- Java中重定向与请求转发的区别
- 程序员适合哪些社区?
- 机器学习第二节-监督学习应用.梯度下降
- simulate std string
- Mina框架实现最简单的服务端(四)
- 9.png图片的处理
- eclipse关闭html/jsp/js的hover提示
- 修改 Content-Disposition 可激活操作系统预览,不在浏览器内查看
- Mina框架实现最简单的服务端(五)
- tomcat 内存 jvm PermSize 调整
- easyui 点击文字展开和收缩节点
- MySQL索引原理及慢查询优化