关于指针赋值问题
#include<iostream.h>#include"string.h"classstring{private:char*rep;public:string();st...
#include <iostream.h>
#include"string.h"
class string
{
private:
char *rep;
public:
string();
string (const char *);
void print();
};
string::string()
{
rep=new char[10];
rep=NULL;
}
string::string (const char *p)
{
rep=new char[strlen(p)+1];
for(int i=0;i<(strlen(p)+1);i++)
*rep++=*p++;
}
void string::print()
{
cout<<rep;
}
void main()
{
char a[10];
cout<<"请输入数据:"<<endl;
cin>>a;
string str_(a);
str_.print();
}
在有参构造函数中对P指向的a数组进行赋值,给rep指针指向的新开辟的内存空间时有错误,谢谢高手解决,,,不需要C语言中的赋值函数,,谢谢.. 展开
#include"string.h"
class string
{
private:
char *rep;
public:
string();
string (const char *);
void print();
};
string::string()
{
rep=new char[10];
rep=NULL;
}
string::string (const char *p)
{
rep=new char[strlen(p)+1];
for(int i=0;i<(strlen(p)+1);i++)
*rep++=*p++;
}
void string::print()
{
cout<<rep;
}
void main()
{
char a[10];
cout<<"请输入数据:"<<endl;
cin>>a;
string str_(a);
str_.print();
}
在有参构造函数中对P指向的a数组进行赋值,给rep指针指向的新开辟的内存空间时有错误,谢谢高手解决,,,不需要C语言中的赋值函数,,谢谢.. 展开
2个回答
展开全部
你犯了几个错误:
1)*rep++=*p++;
p指针在变,你的for还用strlen(p)做循环条件。p每增一次,strlen(p)少1,所以循环的次数肯定不对。
对策:增加临时变量保存strlen(p)
2)*rep++=*p++;
你想用rep来存字符串,但是你不停的改变rep的地址值,就算你正确的将p字符串存入rep。当for循环结束时,rep的指针已经指向了字符串的结束处,直接打印rep当然打的是空的。
对策:用临时指针来遍历rep
3)new内存一定要释放!内存泄露是很严重的事
对策:增加一个析构函数来释放内存
4)写程序要注意效率。
你用strlen(p)来做循环条件,假如p的长度为10000,那么你循环10000次,就调用strlen 10000。你知道strlen怎么实现的吗?也是遍历了整个字符串才计算到的长度。如果p长度10000,你相当于遍历了10000+10000+9999+9998+...+1)个字符。
对策:对于耗性能的操作,执行一次然后用变量保存起来。
修改后的程序:
#include <iostream.h>
#include"string.h"
class string
{
private:
char *rep;
public:
string();
string (const char *);
~string();
void print();
};
string::string()
{
//rep=new char[10];
rep=NULL;
}
string::~string()
{
if(NULL != rep)
delete [] rep;
}
string::string (const char *p)
{
int sLen = strlen(p);
rep=new char[sLen+1];
char * ptmp = rep;
for(int i=0;i<sLen+1;i++)
*ptmp++=*p++;
}
void string::print()
{
cout<<rep<<endl;
}
void main()
{
char a[10];
cout<<"请输入数据:"<<endl;
cin>>a;
string str_(a);
str_.print();
}
额。。 写完才发现没分。。
算是做好事了
1)*rep++=*p++;
p指针在变,你的for还用strlen(p)做循环条件。p每增一次,strlen(p)少1,所以循环的次数肯定不对。
对策:增加临时变量保存strlen(p)
2)*rep++=*p++;
你想用rep来存字符串,但是你不停的改变rep的地址值,就算你正确的将p字符串存入rep。当for循环结束时,rep的指针已经指向了字符串的结束处,直接打印rep当然打的是空的。
对策:用临时指针来遍历rep
3)new内存一定要释放!内存泄露是很严重的事
对策:增加一个析构函数来释放内存
4)写程序要注意效率。
你用strlen(p)来做循环条件,假如p的长度为10000,那么你循环10000次,就调用strlen 10000。你知道strlen怎么实现的吗?也是遍历了整个字符串才计算到的长度。如果p长度10000,你相当于遍历了10000+10000+9999+9998+...+1)个字符。
对策:对于耗性能的操作,执行一次然后用变量保存起来。
修改后的程序:
#include <iostream.h>
#include"string.h"
class string
{
private:
char *rep;
public:
string();
string (const char *);
~string();
void print();
};
string::string()
{
//rep=new char[10];
rep=NULL;
}
string::~string()
{
if(NULL != rep)
delete [] rep;
}
string::string (const char *p)
{
int sLen = strlen(p);
rep=new char[sLen+1];
char * ptmp = rep;
for(int i=0;i<sLen+1;i++)
*ptmp++=*p++;
}
void string::print()
{
cout<<rep<<endl;
}
void main()
{
char a[10];
cout<<"请输入数据:"<<endl;
cin>>a;
string str_(a);
str_.print();
}
额。。 写完才发现没分。。
算是做好事了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询