如何在C++回文类中实现动态C字符串存储(禁用string/cstring)
Palindrome类实现建议
首先,你当前的头文件不可行,核心问题是缺少用于动态存储字符的指针成员,必须补充以下私有成员:
char* data;
关于动态C字符串的大小调整
C风格数组无法直接修改大小,必须通过重新分配内存实现:
- 当需要存储新内容时,先计算所需的内存空间(比如要存储原单词的一半:奇数长度取
(orig_len + 1)/2,偶数长度取orig_len/2,还要额外加1存储结束符'\0')。 - 用
new char[所需大小]分配新内存,将需要保留的内容逐一复制到新内存中。 - 释放旧内存(
delete[] data;),再让data指向新分配的内存块。 store_size记录当前分配的总内存大小,len可用来记录原单词的长度,或者存储的一半内容的长度,根据需求明确即可。
关键方法实现要点
- 构造函数/析构函数/赋值运算符:
- 默认构造函数:初始化
data = nullptr,len = 0,store_size = 0。 - 带
const char*参数的构造函数:先手动遍历输入字符串计算原长度(不能用strlen),调用静态isPalindrome判断是否为回文,再计算需要存储的一半长度,分配内存并复制对应字符。 - 拷贝构造和赋值运算符必须实现深拷贝:不能直接复制指针,要重新分配内存并复制内容,避免浅拷贝导致的内存泄漏或重复释放。
- 析构函数必须执行
delete[] data;释放动态内存。
- 默认构造函数:初始化
- set_palindrome方法:
先验证输入字符串是否为回文,再按上述动态内存调整逻辑更新data、len和store_size。 - isPalindrome静态方法:
手动遍历字符串首尾字符,逐一比较,直到中间位置,全部相等则返回true。 - 访问类方法(char_at、set_char_at等):
要做边界检查,确保传入的pos在有效范围内,避免越界访问。
补充说明
因为禁止使用string和cstring,所有字符串操作(长度计算、字符复制、比较)都要手动实现:
- 计算字符串长度:从首字符开始遍历,直到遇到
'\0',计数。 - 字符比较:逐字符对比,直到出现不同字符或到达字符串末尾。
内容的提问来源于stack exchange,提问作者Leaf Man
相关产品推荐
相关产品推荐

