我知道这里有一个类似的问题。但是我的实现有点不同,
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(( 继续读取。
希望这有帮助