P
Ich weis, das kommt spät, aber hier die Methode:
Aber das Problem ist mittlerweile schon gelöst, die Klasse wird ohne Fehler kompiliert und funktioniert(e) auch. Nun habe ich mal nach zig Monaten den Code mal wieder ausgekramt und wollte ihn testen, aber da kam nichts gutes raus. Es liegt aber vermutlich an meinem Programm was es testet, denn als ich es damals testete hat alles wunderbar geklappt :D!
Hier nochmal das ganze in für meine Begriffe eigentlicher Perfektion :
#include "String.h"
String::String(char* string) {
length = getLength(string);
value = new char[length+1];
int i = 0;
while (i < length) value[i] = string[i++];
value[i] = '\0';
}
String::String(unsigned short len) {
length = len;
value = new char[length];
}
String::String(String &string) {
length = string.getLength();
value = new char[length+1];
int i = 0;
char* str = string.toCharPointer();
while (i < length) value[i] = str[i++];
value[i] = '\0';
}
String::String() {
length = 0;
value = new char[1];
value[0] = '\0';
}
String::~String() {
delete [] value;
}
bool String::equals(String &string) const {
return equals(string.toCharPointer());
}
bool String::equals(char* string) const {
char *p1, *p2;
p1 = string;
p2 = value;
while (p1[0] != '\0' && p2[0] != '\0') {
if (p1[0] == p2[0]) {
++p1;
++p2;
} else {
return false;
}
}
return true;
}
int String::getLength() const {
return getLength(value);
}
int String::getLength(char* string) const {
char *p = string;
register int c = 0;
while (p[0] != '\0') { ++p; ++c; }
return c;
}
bool String::equalsIgnoreCase(String &string) const {
return equalsIgnoreCase(string.toCharPointer());
}
bool String::equalsIgnoreCase(char* string) const {
char *p1, *p2;
p1 = string;
p2 = value;
while (p1[0] != '\0' && p2[0] != '\0') {
if (p1[0] == p2[0]) {
++p1;
++p2;
} else if (p2[0] <= 90 && p2[0] >= 65) {
if (p1[0] == p2[0] + 32) {
++p1;
++p2;
} else {
return false;
}
} else if (p2[0] >= 97 && p2[0] <= 122) {
if (p1[0] == p2[0] -32) {
++p1;
++p2;
} else {
return false;
}
} else {
return false;
}
}
return true;
}
char String::charAt(int index) const {
char *p2;
p2 = value;
if (length < index) {
return -1;
} else {
return p2[index];
}
return -1;
}
bool String::regionMatches(bool ignoreCase, int toffset, String &other, int ooffset, int len) const {
return regionMatches(ignoreCase, toffset, other.toCharPointer(), ooffset, len);
}
bool String::regionMatches(bool ignoreCase, int toffset, char* other, int ooffset, int len) const {
if (length-toffset < len) {
return false;
}
if (ignoreCase == true) {
char *p1, *p2;
p1 = value;
p2 = other;
int tlen = 0;
for (int i = 0; i < toffset; i++) {
++p1;
}
for (int j = 0; j < ooffset; j++) {
++p2;
}
while (p1[0] != '\0' && p2[0] != '\0' && tlen < len) {
++tlen;
if (p1[0] == p2[0]) {
++p1;
++p2;
} else if (p2[0] <= 90 && p2[0] >= 65) {
if (p1[0] == p2[0] + 32) {
++p1;
++p2;
} else {
return false;
}
} else if (p2[0] >= 97 && p2[0] <= 122) {
if (p1[0] == p2[0] -32) {
++p1;
++p2;
} else {
return false;
}
} else {
return false;
}
}
return true;
} else {
char *p1, *p2;
p1 = value;
p2 = other;
for (int i = 0; i < toffset; i++) {
++p1;
}
for (int j = 0; j < ooffset; j++) {
++p2;
}
int tlen = 0;
while (p1[0] != '\0' && p2[0] != '\0' && tlen < len) {
++tlen;
if (p1[0] == p2[0]) {
++p1;
++p2;
} else {
return false;
}
}
return true;
}
return false;
}
bool String::startsWith(String &string) const {
return startsWith(string.toCharPointer());
}
bool String::startsWith(char* string) const {
return regionMatches(false, 0, string, 0, getLength(string));
}
bool String::endsWith(String &string) const {
return endsWith(string.toCharPointer());
}
bool String::endsWith(char* string) const {
for (int i = length; i > 0; i--) {
if (regionMatches(false, i, string, 0, getLength(string)) && length - i == getLength(string)) return true;
}
return false;
}
void String::concat(String &string) {
concat(string.toCharPointer());
}
void String::concat(char* string) {
int len = length + getLength(string);
char* buffer = new char[len+1];
int c = 0;
while (c < length) buffer[c] = value[c++];
int c2 = 0;
while (c < len) buffer[c++] = string[c2++];
buffer[c] = '\0';
setValue(buffer);
delete [] buffer;
}
char* String::toCharPointer() {
return value;
}
void String::replace(char oldChar, char newChar) {
char *p = value;
while (p[0] != '\0') {
if (p[0] == oldChar) {
p[0] = newChar;
}
++p;
}
}
void String::replaceCharAt(int index, char newChar) {
if (index >= length) {
return;
}
char *p = value;
p[index] = newChar;
}
void String::replace(char* oldString, char* newString) {
if (getLength(oldString) == 0) {
return;
} else if (getLength(newString) == 0) {
return;
}
for (int i = 0; i < length; i++) {
if (regionMatches(false, i, oldString, 0, getLength(oldString))) {
char *p1;
p1 = value;
char* buffer = new char[i+1]; // Alle chars vor i
int l = length-i-getLength(oldString);
char* buffer2 = new char[l+1]; // alle chars ab i und oldString
if (getLength(buffer) == 0 && l != 0) {
int c = i + getLength(oldString);
for (int k = 0; k < l; k++) buffer2[k] = p1[c++];
buffer2[l] = '\0';
setValue(buffer);
p1 = 0;
concat(buffer2);
} else if (i != 0 && l == 0) {
for (int j = 0; j < i; j++) buffer[j] = p1[j];
buffer[i] = '\0';
setValue(buffer);
p1 = 0;
concat(newString);
} else if (i == 0 && l == 0) {
p1 = 0;
setValue(newString);
} else {
for (int j = 0; j < i; j++) buffer[j] = p1[j];
buffer[i] = '\0';
int c = i + getLength(oldString);
for (int k = 0; k < l; k++) buffer2[k] = p1[c++];
buffer2[l] = '\0';
setValue(buffer);
p1 = 0;
concat(newString);
concat(buffer2);
}
delete [] buffer;
delete [] buffer2;
}
}
length = getLength(value);
}
void String::replace(String &oldString, String &newString) {
replace(oldString.toCharPointer(), newString.toCharPointer());
}
int String::indexOf(char* string, int fromIndex) const {
for (int i = fromIndex; i < length; i++) {
if (regionMatches(false, i, string, 0, getLength(string))) return i;
}
return -1;
}
int String::indexOf(String &string, int fromIndex) const {
return indexOf(string.toCharPointer(), fromIndex);
}
int String::lastIndexOf(char* string, int fromIndex) const {
for (int i = length; i > fromIndex; i--) {
if (regionMatches(false, i, string, 0, getLength(string))) return i;
}
return -1;
}
int String::lastIndexOf(String &string, int fromIndex) const {
return lastIndexOf(string.toCharPointer(), fromIndex);
}
void String::toLowerCase() {
char *p = value;
while (p[0] != '\0') {
if (p[0] <= 90 && p[0] >= 65) p[0] += 32;
++p;
}
}
void String::toUpperCase() {
char *p = value;
while (p[0] != '\0') {
if (p[0] >= 97 && p[0] <= 122) p[0] -= 32;
++p;
}
}
String String::substring(int beginIndex) const {
return substring(beginIndex, length);
}
String String::substring(int beginIndex, int endIndex) const {
if (endIndex > length || beginIndex > length || beginIndex > endIndex) return String(value);
String buffer((endIndex-beginIndex)+2);
char *p = value;
int c = 0;
for (int i = 0; i < beginIndex; i++) p++;
while (p[0] != '\0' && c <= endIndex-beginIndex) {
buffer[c++] = p[0];
++p;
}
buffer[c] = '\0';
return buffer;
}
void String::trim() {
char *p = value;
int c = 0;
while (p[c++] <= 32) {}
--c;
int c2 = 0;
char* buffer = new char[length-c+2];
int len = length-c;
for (int i = 0; i < len; i++) { buffer[i] = p[c++]; ++c2; }
--c2;
while (buffer[c2--] <= 32) {}
c2 += 2;
buffer[c2] = '\0';
setValue(buffer);
delete [] buffer;
}
int String::numberOf(char thatChar) const {
char *p = value;
int number = 0;
while (p[0] != '\0') {
if (p[0] == thatChar) {
++number;
}
++p;
}
return number;
}
int String::numberOf(char* str) const {
int i = 0;
int number = 0;
while (i < length) {
if (regionMatches(false, i, str, 0, getLength(str))) {
++number;
i += getLength(str);
} else {
++i;
}
}
return number;
}
int String::numberOf(String str) const {
return numberOf(str.toCharPointer());
}
String& String::operator=(String &string) {
if (this == &string) return *this;
delete [] value;
length = string.getLength();
int i = 0;
value = new char[length+1];
char* str = string.toCharPointer();
while (i < length) value[i] = str[i++];
value[i] = '\0';
return *this;
}
String& String::operator=(char* string) {
if (&value == &string) return *this;
delete [] value;
length = getLength(string);
int i = 0;
value = new char[length+1];
while (i < length) value[i] = string[i++];
value[i] = '\0';
return *this;
}
String String::operator+(String &string) {
String str = *this;
str.concat(string);
return str;
}
void String::operator+=(String &string) {
concat(string);
}
void String::setValue(char* string) {
if (&value == &string) return;
delete [] value;
length = getLength(string);
int i = 0;
value = new char[length+1];
while (i < length) value[i] = string[i++];
value[i] = '\0';
}
char &String::operator[](unsigned short offset) {
if (offset > length)
return value[length-1];
else
return value[offset];
}
void String::setValue(String &string) {
setValue(string.toCharPointer());
}