用c++ 实现字符串操作类。成员函数需要有:str_copy,str_compare,str_lenth,字符串可以用 ‘+’ 实现两个字符串连接,所有的字符串都用 char * 或者 char 数组。不得用字符串操作的系统函数。
'+'可以重载操作符
#include <iostream>
using namespace std;
class mystring
{
protected:
char s[1000];
public:
mystring() {};
mystring(char *p)
{
int i=0;
while(p[i] != '\0')
{
s[i] = p[i];
i++;
}
s[i] = '\0';
}
int str_length()
{
int i=0;
while(s[i++] != '\0');
return i-1;
}
mystring& operator + (mystring b)
{
int len = str_length();
int i=0;
while(b.s[i] != '\0')
{
s[len+i] = b.s[i];
i++;
}
s[len+i] = '\0';
return *this;
}
void str_cpy(mystring b)
{
int i=0;
while(b.s[i] != '\0')
{
s[i] = b.s[i];
i++;
}
s[i] = '\0';
}
int str_compare(mystring b)
{
int i=0,j=0;
while(s[i] != '\0' && b.s[j] != '\0')
{
if(s[i] != b.s[j])
break;
i++;
j++;
}
if(s[i] == '\0' && b.s[j] == '\0')
return 0;
if(s[i] == '\0')
return -1;
if(b.s[j] == '\0')
return 1;
if(s[i] > s[j])
return 1;
return -1;
}
friend ostream& operator << (ostream &cout,mystring &b);
};
ostream& operator << (ostream &cout,mystring &b)
{
cout<<b.s;
return cout;
}
int main()
{
mystring s1("Hello");
mystring s2("Yes");
s1 = s1 + s2;
cout<<s1.str_length()<<endl;
cout<<s1<<endl;
cout<<s1.str_compare(s2)<<endl;
return 0;
}
#ifndef _H_MyString
#define _H_MyString
#include <iostream>
namespace MyString {
template<typename T>
class It {
private:
T* data;
public:
It(T* data) {
this->data = data;
}
};
class String {
private:
char* data;
size_t size;
public:
String(const char* data);
void setLength(size_t size);
bool str_compare(const String &string) const;
size_t str_lenth() const;
void add(const String &text);
String str_copy() const;
char* getData() const;
};
String operator+(const String &string1, const String &string2);
}
#endif
#include "String.h"
#include <string.h>
#include <iostream>
using namespace std;
namespace MyString
{
/**
* Constructor with char*
*/
String::String(const char *data)
{
size_t size = strlen(data);
this->data = new char[size];
this->size = size;
if (this->data != NULL)
{
strncpy(this->data, data, size);
}
}
/**
* Copy Constructor
*/
String String::str_copy() const
{
char *data = new char[this->size];
if (this->data != NULL)
{
strncpy(data, this->data, this->size);
}
return MyString::String(data);
}
void String::setLength(size_t size)
{
size_t old_length = this->str_lenth();
char *old_data = this->data;
this->size = size;
this->data = new char[size];
// Copy the characters (or add \0 if there are no characters anymore).
for (size_t i = 0; i < size; i++)
{
if (i < old_length)
{
this->data[i] = old_data[i];
}
else
{
this->data[i] = '\0';
}
}
// Destroy the old data
delete[] old_data;
// Ensure that the last element is \0
this->data[size] = '\0';
}
size_t String::str_lenth() const
{
return strlen(this->data);
}
void String::add(const String &text)
{
size_t new_size = this->size + text.size;
setLength(new_size);
size_t length = str_lenth();
for (size_t i = length; i < new_size; i++)
{
this->data[i] = text.data[i - length];
}
}
bool String::str_compare(const String &string) const
{
return strcmp(this->data, string.data) == 0;
}
char *String::getData() const
{
return this->data;
}
/** Free Operator Methods **/
String operator+(const String &string1, const String &string2)
{
String string = String(string1);
string.add(string2);
return string;
}
bool operator==(const String &string1, const String &string2)
{
return string1.str_compare(string2);
}
}
int main(int argc, char const *argv[])
{
MyString::String string1("Welt");
cout << string1.getData() << endl;
cout << "字符串长度:" << string1.str_lenth() << endl;
MyString::String string2 = string1.str_copy();
cout << "字符串比较:" << string2.str_compare(string1) << endl;
MyString::String string3 = string1 + string2;
cout << "字符串相加:" << string3.getData() << endl;
cout << "字符串比较:" << string3.str_compare(string1) << endl;
return 0;
}