我知道存在类似的问题here。 但是我的实现有些不同,
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] = '\0';
}
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;
}
在这段代码中,由于某种原因,我的显示功能给出了奇怪的结果。 有人可以帮我这个功能吗?
答案 0 :(得分:2)
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
}
然后从您的read方法中调用此方法,而不是自己做多余的事情。
while((c = getchar()) != '\n') {
appendChar(c);
}
您会注意到我利用了一个新的类字段-容量。
答案 1 :(得分:1)
输入法似乎没有达到您的期望,
while((c = getchar()) != '\n') {
str = new char[length + 1];
将为每个字符输入创建一个新的char [],因此在显示字符串时,您会得到随机垃圾。
此外,在循环之后,您还可以执行以下操作:
}
str = new char[length + 1];
再次创建一个新的char指针数组,但从未真正获取上一个char指针的内容。
要解决此问题,请使用您获取输入的方法,例如将char []的初始大小设置为任意数字(例如8),并在读取8个以上字符时才分配更多内存。之后,您可以分配此大小的两倍,复制前一个char []的内容,然后继续使用getchar()进行读取。
希望这会有所帮助