关于指针赋值问题

#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语言中的赋值函数,,谢谢..
展开
 我来答
clt2003026
2010-12-09 · TA获得超过218个赞
知道答主
回答量:216
采纳率:0%
帮助的人:172万
展开全部
你犯了几个错误:
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();
}

额。。 写完才发现没分。。
算是做好事了
zyl0462
2010-12-09 · TA获得超过1082个赞
知道小有建树答主
回答量:433
采纳率:75%
帮助的人:331万
展开全部
string::string (const char *p)
{
rep=new char[strlen(p)+1];
for(int i=0;i<(strlen(p)+1);i++)
*(rep+i)=*(p+i);//这里你对rep指针进行操作了,导致乱码,还有最好添加析构函数释放内存
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式