ssy/c++上机1.cpp

141 lines
3.2 KiB
C++
Raw Permalink Normal View History

2024-08-05 20:42:46 +05:30
#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;
}