141 lines
3.2 KiB
C++
141 lines
3.2 KiB
C++
|
#include <iostream>
|
||
|
#include <cstring>
|
||
|
|
||
|
class CTString {
|
||
|
private:
|
||
|
char *m_pData; // 用于保存字符数据
|
||
|
int m_nLen; // 记录字符长度
|
||
|
|
||
|
public:
|
||
|
// 构造函数和析构函数
|
||
|
CTString();
|
||
|
CTString(const char *);
|
||
|
CTString(const CTString&);
|
||
|
~CTString();
|
||
|
|
||
|
// 其它成员函数
|
||
|
CTString* Copy(CTString*);
|
||
|
CTString* Connect(CTString*);
|
||
|
int Find(CTString*);
|
||
|
int Find(char) const;
|
||
|
void Print() const;
|
||
|
|
||
|
// 获取字符数据的公有函数
|
||
|
const char* GetData() const {
|
||
|
return m_pData;
|
||
|
}
|
||
|
|
||
|
// 查找子串
|
||
|
int FindSubstring(CTString*);
|
||
|
};
|
||
|
|
||
|
// 构造函数
|
||
|
CTString::CTString() {
|
||
|
m_nLen = 0;
|
||
|
m_pData = new char[1];
|
||
|
*m_pData = '\0';
|
||
|
}
|
||
|
|
||
|
CTString::CTString(const char *pData) {
|
||
|
m_nLen = strlen(pData);
|
||
|
m_pData = new char[m_nLen + 1];
|
||
|
strcpy(m_pData, pData);
|
||
|
}
|
||
|
|
||
|
// 拷贝构造函数
|
||
|
CTString::CTString(const CTString& str) {
|
||
|
m_nLen = str.m_nLen;
|
||
|
m_pData = new char[m_nLen + 1];
|
||
|
strcpy(m_pData, str.m_pData);
|
||
|
}
|
||
|
|
||
|
// 析构函数
|
||
|
CTString::~CTString() {
|
||
|
delete [] m_pData;
|
||
|
}
|
||
|
|
||
|
// 拷贝函数
|
||
|
CTString* CTString::Copy(CTString *str) {
|
||
|
*str = *this;
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
// 连接函数
|
||
|
CTString* CTString::Connect(CTString *str) {
|
||
|
CTString *temp = new CTString;
|
||
|
temp->m_nLen = m_nLen + str->m_nLen;
|
||
|
temp->m_pData = new char[temp->m_nLen + 2]; // 加上一个空格的长度
|
||
|
strcpy(temp->m_pData, m_pData);
|
||
|
strcat(temp->m_pData, " "); // 添加一个空格
|
||
|
strcat(temp->m_pData, str->m_pData);
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
// 查找子串
|
||
|
int CTString::FindSubstring(CTString *str) {
|
||
|
char *ptr = strstr(m_pData, str->m_pData);
|
||
|
if (ptr) {
|
||
|
// 计算子串在主串中的位置,考虑到额外的空格
|
||
|
int pos = ptr - m_pData;
|
||
|
return pos - 1; // 减去额外的空格
|
||
|
} else {
|
||
|
return -1; // 未找到
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 查找字符
|
||
|
int CTString::Find(char ch) const {
|
||
|
char *ptr = strchr(m_pData, ch);
|
||
|
if (ptr) {
|
||
|
// 计算字符在字符串中的位置,考虑到额外的空格
|
||
|
int pos = ptr - m_pData;
|
||
|
return pos - 1; // 减去额外的空格
|
||
|
} else {
|
||
|
return -1; // 未找到
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 打印输出字符串内容
|
||
|
void CTString::Print() const {
|
||
|
std::cout << "字符串内容:" << m_pData << std::endl;
|
||
|
}
|
||
|
|
||
|
int main() {
|
||
|
char strInput1[100], strInput2[100], charToFind;
|
||
|
|
||
|
std::cout << "请输入第一个字符串: ";
|
||
|
std::cin.getline(strInput1, 100);
|
||
|
|
||
|
std::cout << "请输入第二个字符串: ";
|
||
|
std::cin.getline(strInput2, 100);
|
||
|
|
||
|
std::cout << "请输入要查找的字符: ";
|
||
|
std::cin >> charToFind;
|
||
|
|
||
|
CTString str1(strInput1);
|
||
|
CTString str2(strInput2);
|
||
|
CTString str3(str1);
|
||
|
CTString *str4 = new CTString;
|
||
|
|
||
|
str3.Copy(str4);
|
||
|
CTString *str5 = str4->Connect(&str2);
|
||
|
|
||
|
str1.Print();
|
||
|
str3.Print();
|
||
|
str5->Print();
|
||
|
|
||
|
const char *data = str5->GetData();
|
||
|
int subStrPos = str5->FindSubstring(&str2);
|
||
|
if (subStrPos >= 0)
|
||
|
std::cout << "子串位置: " << subStrPos << std::endl;
|
||
|
|
||
|
int charPos = str5->Find(charToFind);
|
||
|
if (charPos >= 0)
|
||
|
std::cout << "字符位置: " << charPos << std::endl;
|
||
|
|
||
|
delete str4;
|
||
|
delete str5;
|
||
|
|
||
|
return 0;
|
||
|
}
|