fork(1) download
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. #include <utility>
  6.  
  7.  
  8. class string {
  9. char* _c_str;
  10. std::size_t _length;
  11. std::size_t _capacity;
  12.  
  13. public:
  14. string(const char* str, std::size_t capacity)
  15. : _c_str(nullptr), _length(0), _capacity(0)
  16. {
  17. _length = strlen(str);
  18. _capacity = capacity;
  19. if (_length > _capacity) { // 指定された大きさのバッファでは足りない
  20. _capacity = _length;
  21. }
  22. _c_str = reinterpret_cast< char* >(malloc(sizeof(char) * _capacity + sizeof(char))); // 終端文字を考慮
  23. memset(_c_str, 0, sizeof(char) * _capacity + sizeof(char));
  24. strncpy(_c_str, str, _length);
  25. }
  26.  
  27. // copy
  28. string(const string& rhs)
  29. : string(rhs.c_str(), rhs.length()) {
  30. }
  31. string& operator= (const string& rhs) {
  32. if (this->capacity() >= rhs.length()) {
  33. strncpy(this->_c_str, rhs.c_str(), rhs.length());
  34. this->_length = rhs.length();
  35. memset(this->end(), 0, (this->capacity() - this->length() + 1) * sizeof(char));
  36. return (*this);
  37. }
  38. // バッファには入りきらない場合
  39. string new_val(rhs);
  40. std::swap(this->_c_str, new_val._c_str);
  41. std::swap(this->_length, new_val._length);
  42. std::swap(this->_capacity, new_val._capacity);
  43. return (*this);
  44. }
  45.  
  46. ~string() {
  47. if (_c_str) {
  48. free(_c_str);
  49. _c_str = nullptr;
  50. _length = _capacity = 0;
  51. }
  52. }
  53.  
  54. const char* c_str() const noexcept { return _c_str; }
  55. std::size_t length() const noexcept { return _length; }
  56. std::size_t capacity() const noexcept { return _capacity;}
  57.  
  58. // begin, end
  59. char* begin() { return _c_str; }
  60. char* end() { return begin() + length(); } // 終端文字を返す
  61. const char* begin() const { return _c_str; }
  62. const char* end() const { return begin() + length(); } // 終端文字を返す
  63. const char* cbegin() const { return begin(); }
  64. const char* cend() const { return end(); } // 終端文字を返す
  65.  
  66. };
  67.  
  68. // compare
  69. bool operator== (const string& s1, const string& s2) {
  70. return !strcmp(s1.c_str(), s2.c_str());
  71. }
  72.  
  73. int main() {
  74. string str1("abcdef", 6);
  75. string str2("abcdefg", 0);
  76. string str3("", 10);
  77.  
  78. str2 = str1;
  79. str3 = str1;
  80.  
  81. printf("string: %s\nlength: %d\ncapacity:%d\n",
  82. str2.c_str(), str2.length(), str2.capacity());
  83. printf("string: %s\nlength: %d\ncapacity:%d\n",
  84. str3.c_str(), str3.length(), str3.capacity());
  85.  
  86. if (str1 == str2) {
  87. printf("str1 == str2\n");
  88. }
  89. }
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
string: abcdef
length: 6
capacity:7
string: abcdef
length: 6
capacity:10
str1 == str2