在 C++ 中实现自己的字符串类
implementing own string class in c++
我知道这里有一个类似的问题。但是我的实现有点不同,
class String {
private:
char* str;
long int length;
public:
String() {
str = NULL;
length = 0;
}
void input() {
char c;
while((c = getchar()) != 'n') {
str = new char[length + 1];
length++;
str[length - 1] = c;
}
str = new char[length + 1];
str[length] = ' ';
}
long int getLength() {
return length;
}
void display() {
for(int i = 0; i < length; i++)
cout<<str[i];
}
~String() {
delete[] str;
length = 0;
}
};
int main(void) {
String s;
s.input();
cout<<s.getLength()<<endl;
s.display();
cout<<endl;
return 0;
}
在此代码中,出于某种原因,我的显示函数给出了奇怪的结果。谁能帮我这个功能?
void appendChar(char c) {
if (length + 2 >= capacity) { // one for append and one for null byte
capacity += 128;
char *newPtr = new char[capacity];
if (length > 0) {
strcpy(newPtr, str);
}
if (str != NULL) {
delete [] str;
}
str = newPtr;
}
str[length++] = c; // append the character
str[length] = 0; // add a null byte so it's zero terminated
}
然后从读取方法调用此方法,而不是自己执行额外的操作。
while((c = getchar()) != 'n') {
appendChar(c);
}
你会注意到我使用了一个新的类字段 - 容量。
输入法似乎没有做你期望它做的事情,这个:
while((c = getchar()) != 'n') {
str = new char[length + 1];
将为每个字符输入创建一个新的 char[],因此在显示字符串时,您会得到随机垃圾。
此外,在循环之后,您还可以执行以下操作:
}
str = new char[length + 1];
再次创建一个新的字符指针数组,但从未实际获取前一个指针的内容。
为了解决这个问题,使用您的获取输入的方法,我会做一些事情,例如将 char[] 的初始大小设置为某个任意数字(例如 8(,并且仅在读取超过 8 个字符时才分配更多内存。 之后,您可以分配两倍的大小,复制上一个 char[] 的内容并使用 getchar(( 继续读取。
希望这有帮助
相关文章:
- 在 cpp 自己的版本中对字符串进行哈希处理
- 如何为C++映射创建自己的字符串比较对象
- 尝试编写我自己的字符串类在 gcc 中出现异常
- 使用 const char * 与 char * 创建自己的字符串
- 如何用自己的定界符分开字符串
- C++,使用自己的条件搜索文件中的字符串
- 如何使用新字符串而不是分配器创建自己的字符串类型向量?
- 在 C++ 中实现自己的字符串类
- 运算符重载 (+=,=) 用于自己的字符串
- 我可以在"setDefaultButton"中使用我自己的用户定义字符串吗
- 读取和分析文件,将解析的字符串的每个部分分配给其自己的变量
- 我可以在C++中使用 != 和 == 进行字符串比较,而无需编写自己的字符串
- 创建我自己的strlen和子字符串函数
- 使向后的字符串成为自己的字符串
- 编写我自己的字符串类"reference to ‘string’ is ambiguous"但出现编译错误
- 不能在标准向量中插入自己的结构,但是字符串可以
- 如何在C++中将字符串中的元素转换为它自己的字符串?
- C++ - 为学校构建自己的字符串类,无法正确重载<运算符
- 创建了自己的字符串类——重载赋值操作符和析构函数的错误
- 如何拥有自己的没有公共构造函数的字符串类