注册 登录
编程论坛 C++教室

[求助][原创] 自己定义一个string类,将字符反顺序排序后,显示出的是乱码

laigaoat2005 发布于 2007-06-22 18:49, 2061 次点击

//============================================================================//
//===========程序功能:自己定义一个string类,并用它建立对象===================//
//===程序问题:将字符反顺序排序后,显示出的是乱码,就算字符全部是字母也不行===//
//============================================================================//

#include "iostream.h"
#include "stdio.h"
//============================================================================//
//----------自定义字串类------------------------------------------------------//
class string
{
/******************************************************************************/
/**************私有数据********************************************************/
int length;
char *contents;
int who;
char *fan;

/******************************************************************************/
/**************公有数据********************************************************/
public:

/***构造函数***********************/
string(int id);

/***析构函数***********************/
~string();

/***用户界面************************/
int get_length(){return length;}; //返回字符串的长度
char *get_contents() {return contents;}; //返回字符串的内容的指针
char *get_fan() {return fan;}; //返回字符串的返排列的字符串的指针
int set_contents(int in_length,char *in_contents); //字符内容设置(从终端或其它地方接收参数)
int set_contents(char *in_contents); //字符内容设置(从终端或其它地方接收参数)
};

/***类函数(对数据进行操作)*******************/
string:: string(int id)
{
length=0;
contents=NULL;
fan=NULL;
who=id;
printf("字串对象%d已经初始化!\n\a",who);
};

string:: ~string()
{
printf("字串对象%d已经释放!\n\a",who);
};

int string::set_contents(int in_length,char *in_contents)
{
in_contents[in_length]='\0';
contents=in_contents;
length=in_length;
return 1;
};

int string:: set_contents(char *in_contents)
{
contents=in_contents;
int i=0;
char *p=in_contents;
while(*p++!='\n')i++;
length=i;


/******我想加个将输入的字符串按相反顺序排列,可排出来是乱码!*****************/
int j=0;
char temp[i];
for(j=0; j<i;j++)
{
char t;
t=temp[0];
temp[0]=temp[i];
temp[i]=t;
fan=temp;
}
return 1;
};
//----------------------------------------------------------------------------//
//============================================================================//

//((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((//
//))主函数))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))//
main()
{
int i;
char *p;
string x(1),y(2);
x.set_contents("X--->大家好,这是自己编的类写出来的字串\n\n\a"); //
y.set_contents("Y--->大家好,这是自己编的类写出来的字串\n\n\a");
i=x.get_length();
p=x.get_contents();
cout<<"x_length="<<i<<"x_contents="<<p<<"\n\a";
i=y.get_length();
p=y.get_contents();
cout<<"y_length="<<i<<"y_contents="<<p<<"\n\a";

p=x.get_fan();
cout<<p<<"\n\n";
p=y.get_fan();
cout<<p<<"\n\n";
getchar();
}
//((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((//
//))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))//

21 回复
#2
laigaoat20052007-06-22 20:31
没有人回答我自己先顶一下
#3
laigaoat20052007-06-22 21:00
帮我看看啊,这是怎么回事啊?
#4
aipb20072007-06-22 21:02
请问下,LZ你的代码通过编译了吗?

#5
laigaoat20052007-06-22 21:37

通过的

#6
laigaoat20052007-06-22 21:38
对不起,看别人的贴去了,忘掉看自己的,呵呵.
#7
laigaoat20052007-06-22 21:40
在C-free3.5中通过,其它都是正确的,只是反序后输入出的不是字符串的反序,而是看不懂的乱码!
#8
laigaoat20052007-06-22 21:52
我再顶两下,把它弄成热贴,也许就有人帮我了啊
#9
laigaoat20052007-06-22 21:53
这下都成热贴了,高手来帮帮忙啊?
#10
laigaoat20052007-06-22 21:55
我在线等啊,急啊,快疯了
#11
laigaoat20052007-06-22 21:56
希望洗个澡回来就有人帮我了
#12
野比2007-06-22 21:58
你的temp数组定义大小为i
char temp[i];
所以temp[]的下标范围从0到i-1
你后面又使用了temp[i], 造成下标越界, 出现错误.
#13
laigaoat20052007-06-22 22:02

哦,原来如此,谢谢,洗了澡我去修改看看,

#14
野比2007-06-22 22:06
看看吧...希望只有这一个错..
#15
aipb20072007-06-22 22:23
我在想char temp[i];
i是个变量的嘛!这也可以?
#16
laigaoat20052007-06-23 14:35
可是i的值已经确定了啊,而且我又没有去改变它,应试可以吧?
#17
laigaoat20052007-06-23 14:44

今天看了看昨天的这个题,发现了一相很大的错,今天改了改,但是还是不行,程序如下:
//============================================================================//
//===========程序功能:自己定义一个string类,并用它建立对象===================//
//===程序问题:将字符反顺序排序后,显示出的是知码,就算字符全部是字母也不行===//
//============================================================================//

#include "iostream.h"
#include "stdio.h"
//============================================================================//
//----------自定义字串类------------------------------------------------------//
class string
{
/******************************************************************************/
/**************私有数据********************************************************/
int length;
char *contents;
int who;
char *fan;

/******************************************************************************/
/**************公有数据********************************************************/
public:

/***构造函数***********************/
string(int id);

/***析构函数***********************/
~string();

/***用户界面************************/
int get_length(){return length;}; //返回字符串的长度
char *get_contents() {return contents;}; //返回字符串的内容的指针
char *get_fan()
{
char temp[length];
int j=0;
for(j=0; j<((length-1)/2);j++)
{
char t;
t=temp[j];
temp[j]=temp[length-j-2];
temp[length-j-2]=t;
}
fan=temp;
return fan;
}; //返回字符串的返排列的字符串的指针
int set_contents(int in_length,char *in_contents); //字符内容设置(从终端或其它地方接收参数)
int set_contents(char *in_contents); //字符内容设置(从终端或其它地方接收参数)
};

/***类函数(对数据进行操作)*******************/
string:: string(int id)
{
length=0;
contents=NULL;
fan=NULL;
who=id;
printf("字串对象%d已经初始化!\n\a",who);
};

string:: ~string()
{
printf("字串对象%d已经释放!\n\a",who);
};


int string::set_contents(int in_length,char *in_contents)
{
in_contents[in_length]='\0';
contents=in_contents;
fan=in_contents;
length=in_length;
return 1;
};

int string:: set_contents(char *in_contents)
{
contents=in_contents;
fan=in_contents;
int i=0;
char *p=in_contents;
while(*p++!='\n')i++;
length=i;


/******我想加个将输入的字符串按相反顺序排列,可排出来是乱码!*****************/
/* int j=0;
char temp[length];
for(j=0; j<((length-1)/2);j++)
{
char t;
t=temp[0];
temp[0]=temp[length-1];
temp[length]=t;
}
fan=temp; */
return 1;
};

//----------------------------------------------------------------------------//
//============================================================================//

//((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((//
//))主函数))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))//
main()
{
int i;
char *p;
string x(1),y(2);
x.set_contents("abc"); //大家好,这是自己编的类写出来的字串\n\n\a
y.set_contents("abc"); //大家好,这是自己编的类写出来的字串\n\n\a
i=x.get_length();
p=x.get_contents();
cout<<"x_length="<<i<<" x_contents="<<p<<"\n\a";
i=y.get_length();
p=y.get_contents();
cout<<"y_length="<<i<<" y_contents="<<p<<"\n\a";

p=x.get_fan();
cout<<"x.fan="<<p<<"\n";
p=y.get_fan();
cout<<"y.fan="<<p<<"\n";
getchar();
}
//((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((//
//))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))//

#18
herbert_19872007-06-23 14:51

int string:: set_contents(char *in_contents)
{
contents=in_contents;
fan=in_contents;
int i=0;
char *p=in_contents;
while(*p++!='\n')i++;
length=i;


/******我想加个将输入的字符串按相反顺序排列,可排出来是乱码!*****************/
/* int j=0;
char temp[length];
for(j=0; j<((length-1)/2);j++)
{
char t;
t=temp[0];
temp[0]=temp[length-1];
temp[length]=t;
}
fan=temp; */
return 1;
};

char temp[length]; 是不行的
估计下标要要求用立即数.

#19
laigaoat20052007-06-24 10:42
不,我试过的,只要变量值确定,就可以的
#20
游乐园2007-06-24 19:39

怎么静态数组的维数用变量指定呢 ? 写个大概的...参考下吧

程序代码:

#include<string.h>
#include<iostream.h>


class string;
ostream & operator<<(ostream &output, string &s);
istream & operator>>(istream &input, string &s);


class string
{


public:
string(char *m = \"\");
char* reverseStr();
friend ostream & operator<<(ostream &output, string &s);
    friend istream & operator>>(istream &input, string &s);
~string();
private:
char *str;


};


string::string(char *m)
{
str = new char[strlen(m)+1];
strcpy(str, m);
}


string::~string() {delete []str;}


char* string::reverseStr()
{
char *p1, *p2, ch;
      p1 = p2 = str;
    while(*p2 != '\0')
        p2++;
     p2--;
    while(p1 < p2)
   {
        ch=*p2;*p2=*p1;*p1=ch;
        p1++;p2--;
   }
       return str;
}


ostream & operator<<(ostream &output, string &s)
{
output<<s.str;
return output;
}


istream & operator>>(istream &input, string &s)
{
char temp[1000];
input>>temp;
delete []s.str;
s.str=new char[strlen(temp)+1];
strcpy(s.str,temp);
return input;
}



int main()
{
string s;
cout<<\"input :\"<<endl;
cin>>s;
cout<<\"output :\"<<endl;
cout<<s;
cout<<\"\nafter reversed:  \"<<s.reverseStr()<<endl;


return 0;
}

#21
aipb20072007-06-24 20:20

#22
laigaoat20052007-06-25 00:44
果然是好东西
1