部分函数详解:
1.strAssign:串的赋值操作不能直接用 = 实现。因为串是一个数组,而 = 不能直接将一个数组赋值给另一个数组,这就要求我们必须对数组中的元素进行逐个赋值。
2.strCompare:串的比较是串排序应用中的核心操作。设两串待比较的字符分别为a、b,若a的码值小于b的码值,返回a < b;大于返回a > b。若a = b则继续比较下一对字符。如果上述步骤完成后没有比较出结果,那么先结束的就是较小串,同时结束则相等。
#include "iostream"
#define MAXSIZE 100
using namespace std;
struct staticString {
char str[MAXSIZE + 1];
int length;
};
struct variableString {
char *str;
int length;
};
bool variableStringAssign(variableString &variableStr, char *ch);
int getLength(variableString variableString);
int stringCompare(variableString variableString1, variableString variableString2);
bool concat(variableString &result, variableString variableString1, variableString variableString2);
bool subString(variableString &result, variableString variableString1, int from, int length);
bool clean(variableString &variableString1);
int main() {
variableString string1{};
char ch[MAXSIZE] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0'};
variableStringAssign(string1, ch);
for (int i = 0; i < string1.length; ++i) {
cout << string1.str[i];
}
cout << endl;
variableString string2{};
string2.str = ch;
string2.length = string1.length;
if (stringCompare(string1, string2) == 0) {
cout << "string1 equals string2" << endl;
} else if (stringCompare(string1, string2) > 0) {
cout << "string1 is bigger than string2";
} else {
cout << "string1 is smaller than string2";
}
variableString result1{};
concat(result1, string1, string2);
while (*result1.str != '\0') {
cout << *result1.str++;
}
cout << endl;
variableString result2{};
subString(result2, string1, 2, 4);
while (*result2.str != '\0') {
cout << *result2.str++;
}
cout << endl;
if (clean(string1)) {
cout << "string1 have been emptied!" << endl;
}
}
bool variableStringAssign(variableString &variableStr, char *ch) {
delete variableStr.str;
int length = 0;
char *c = ch;
while (*c != '\0') {
length++;
c++;
}
if (length == 0) {
variableStr.str = nullptr;
variableStr.length = 0;
return true;
} else {
variableStr.str = new char[length + 1];
if (variableStr.str == nullptr) {
return false;
} else {
c = ch;
for (int i = 0; i <= length; ++i, ++c) {
variableStr.str[i] = *c;
}
variableStr.length = length;
return true;
}
}
}
int getLength(variableString variableString) {
return variableString.length;
}
int stringCompare(variableString variableString1, variableString variableString2) {
for (int i = 0; i < variableString1.length && i < variableString2.length; ++i) {
if (variableString1.str[i] != variableString2.str[i]) {
return variableString1.str[i] - variableString2.str[i];
}
}
return variableString1.length - variableString2.length;
}
bool concat(variableString &result, variableString variableString1, variableString variableString2) {
delete result.str;
result.str = nullptr;
result.str = new char[variableString1.length + variableString2.length + 1];
if (result.str == nullptr) {
cerr << "Your memory is not enough" << endl;
return false;
}
int i = 0;
while (i < variableString1.length) {
result.str[i] = variableString1.str[i];
i++;
}
int j = 0;
while (j <= variableString2.length) {
result.str[i + j] = variableString2.str[j];
j++;
}
result.length = variableString1.length + variableString2.length;
return true;
}
bool subString(variableString &result, variableString variableString1, int from, int length) {
if (from < 0 || from > variableString1.length || length < 0 || length > variableString1.length - from) {
cerr << "Your parameters is wrong, please check";
return false;
}
delete result.str;
result.str = nullptr;
if (length == 0) {
result.str = nullptr;
result.length = 0;
return true;
} else {
result.str = new char[length + 1];
int i = from;
int j = 0;
while (i < from + length) {
result.str[j++] = variableString1.str[i++];
}
result.str[j] = '\0';
result.length = length;
return true;
}
}
bool clean(variableString &variableString1) {
delete variableString1.str;
variableString1.str = nullptr;
variableString1.length = 0;
return true;
}