解读一段C++代码,谢谢指教了
看了许久,一直有点晕,程序是从键盘输入一串字符忽略空格回车输入$ENTER结束再屏幕输出。。。望高手解读下,越详细越好,先谢谢啦。。。
#include <iostream>
using namespace std;
class Array{
char *p;
int len;
public:
Array(int n):len(0),p(NULL){
resize(n);
}
void resize(int n){
char* q=new char[n];
int min=(n <len?n:len);
if(p!=NULL){
for(int i=0; i <min; i++)
q[i] = p[i];
delete[] p;
}
p = q;
for(int i=min; i <n; i++)
p[i] = '\0 ';
len = n;
}
void set(int index, char value){
if(index <0||index> =len){
cout < < "ERR: " < < index < < endl;
return;
}
p[index] = value;
}
char get(int index){
if(index <0||index> =len){
cout < < "ERR: " < < index < < endl;
return '! ';
}
return p[index];
}
int size(){
return len;
}
~Array(){
if(p!=NULL){
delete[] p;
p = NULL;
}
}
};
int main()
{
Array a1(10);
cout < < "input chars(end by '$ '): ";
for(int i=0;;i++){
char ch;
cin > > ch;
if(ch== '$ ')
break;
else if(i+1> a1.size())
a1.resize(i+10);
a1.set(i, ch);
}
for(int i=0; i <a1.size(); i++)
cout < < a1.get(i);
cout < < endl;
}
[解决办法]
void resize(int n){
char* q=new char[n];//超过默认长度为10的空间后就分配一个更大的空间
int min=(n <len?n:len);//实际上min =len;不会发生n <len情况
if(p!=NULL){ //如果之前已经分配了一定空间
for(int i=0; i <min; i++)
q[i] = p[i];//把内容复制到更大的新的空间
delete[] p; //删除原来分配的空间
}
p = q; //重新获得P
for(int i=min; i <n; i++)
p[i] = '\0 ';//将P的值(或者剩余值,重新分配更大内存时)初始话,
len = n; //设置当前长度
}
[解决办法]
个人意见,抱着学习态度。首先这是一个自定义的字符串(数组)类,构造函数进行初始化(数组大小等),接着resize(int n)重新调整数组的大小(是在拷贝原有数组的前提下,将原有数组扩大), set(int index,char value )设置具体某一个字符,get(int index)获取具体数组下标的值,size()获取字符数组的大小,析构函数删除动态分配的空间,再来说说测试函数,正如你所说那样程序是从键盘输入一串字符忽略空格回车输入$ENTER结束再屏幕输出。。。,这主要是cin> > char不能读取空格输入,进而没有保存到数组中,直到遇到$才退出,最后显示出来,这其中还包括数组的动态调整。这是我的一点分析,希望你能满意。