C++关于顺序串类的问题~~!~
小弟编写了一个顺序串类,发现有一个错误却无法解决~~~~请大虾们帮帮忙~~~
自编的String类:
/////////String.h//////////////
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
class String
{
private:
char *str; /////串
int size; ///////当前长度
int maxSize; //////最大字符个数
void GetNext(const String& t,int next[])const;
int KMPFind(const String& t,int start,int next[])const; //////KMP算法查找
public:
String(char *s=" "); /////构造函数1
String(int max); /////构造函数2
String(const String &s); /////拷贝构造函数
~String(void); /////析构函数
void Insert(int pos,char *t); /////插入
void Delete(int pos,int length); //////删除
String SubStr(int pos,int length); /////取字串
char& operator[](int n); ///////操作符[]重载
String& operator = (const String& s); /////////操作符=重载1
String& operator = (char *s); //////////操作符=重载2
friend ostream& operator << (ostream& ostr,const String& s);//////操作符<<重载,定义为友元函数
friend istream& operator >> (istream& istr,String& s); ///////操作符>>重载,定义为友元函数
int operator == (const String& s)const; ////////操作符==重载1
int operator ==(char *s)const; ////////操作符==重载2
friend int operator == (char *strL,const String& strR); //////////操作符==重载3,定义为友元函数
};
String::String(char *s) //构造函数1,定义对象并赋初始串值
{
size=strlen(s);
maxSize=size+1;
str=new char[maxSize];
strcpy(str,s);
}
String::String(int max) //构造函数2,定义对象并置最大字符个数
{
maxSize=max;
size=0;
str=new char[maxSize];
}
String::String(const String &s) //构造函数2,定义对象并拷贝赋值
{
maxSize=s.maxSize;
size=s.size;
str=new char[maxSize];
for(int i=0;i<maxSize;i++)
str[i]=s.str[i];
}
String::~String(void)
{
delete []str;
}
void String::Insert(int pos,char *t) ////插入
{
int length=strlen(t);
int i;
if(pos>size||pos<0)
{
cout<<"插入位置参数错!";
return;
}
if(size+length>=maxSize-1)
{
char *p=str;
str=new char[size+length+1]; //重新申请更大的内存空间
for(i=0;i<=size;i++)
str[i]=p[i]; ///原串值赋值
delete []p; /////释放原内存空间
}
//从size至pos逐位右移字符以空出插入字符的位置
for(i=size;i>=pos;i--)
str[i+length]=str[i];
//从pos到pos+length
for(i=0;i<length;i++)
str[pos+i]=str[i];
maxSize=size+length+1;
size=size+length;
}
void String::Delete(int pos,int length) ////删除
//从pos位置开始删除长度为length的子字符串
{
int charsLeft=size-pos; //剩余的最大长度
if(pos>size-1) return;
if(length>charsLeft) length=charsLeft;
//从pos至size逐位左移以删除长度为length的子字符串
for(int i=pos;i<=size;i++)
str[i]=str[i+length];
size=size-length; ///置串的当前长度
}
String String::SubStr(int pos,int length) /////取子串
{
int charsLeft=size-pos; //剩余的最大长度
String temp;
if(pos>size-1)return temp; //返回空串
if(length>charsLeft) length=charsLeft;
delete []temp.str;
temp.str=new char[length+1]; ///重新申请内存空间
for(int i=0;i<length;i++) temp[i]=str[pos+1];
temp[length]=NULL; ///置结束标记符
temp.size=length;
temp.maxSize=length+1;
return temp;
}
char& String::operator[](int i) ////数组元素操作符[]重载
{
return str[i];
}
String& String::operator =(const String& s) //////赋值操作符=重载1
{
if(maxSize<s.maxSize)
{
delete []str;
str=new char[s.maxSize];
}
size=s.size;
maxSize=s.maxSize;
for(int i=0;i<=size;i++)
str[i]=s.str[i];
return *this;
}
String& String::operator =(char *s) //////赋值操作符=重载2
{
int length=strlen(s);
if(maxSize<length+1)
{
delete []str;
str=new char[length+1];
maxSize=length+1;
}
size=length;
strcpy(str,s);
return *this;
}
ostream& operator << (ostream& ostr,const String& s) ///输出流操作符<<重载
{
cout<<"s.size="<<s.size<<endl;
cout<<"s.maxSize="<<s.maxSize<<endl;
cout<<"s.str="<<s.str<<endl;
return ostr;
}
istream& operator >> (istream& istr,String& s) ///输入流操作符>>重载
{
delete []s.str;
cout<<"输入字符串个数";
cin>>s.size;
s.maxSize=s.size+1;
s.str=new char[s.maxSize];
cout<<"输入字符串";
for(int i>0;i<s.size;i++)
cin>>s.str[i];
s.str[s.size]=NULL;
return istr;
}
int String::operator == (const String& s)const ///逻辑等于操作符重载1
{
return(strcmp(str,s.str)==0); /////若逻辑等于则返回1;否则返回0
}
int String::operator ==(char *s)const ///逻辑等于操作符重载2
{
return(strcmp(str,s)==0);
}
int operator ==(char *strL,const String& StrR) ///逻辑等于操作符重载3
{
return (strcmp(strL,StrR.str)==0);
}
测试主函数main.cpp
#include"String.h"
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
void main(void)
{
String str1("Yao Jungyu"),str2("2006151014");
String str3;
String str4(20);
String str5(str1);
char st[]="Pan Hongyu";
cout<<"拷贝构造函数测试:"<<endl<<str5;
str2.Insert(11,st);
cout<<"插入测试:"<<endl<<str2;
str2.Delete(0,11);
cout<<"删除测试:"<<endl<<str2;
str3=str1.SubStr(4,11);
cout<<"取子串和对象赋值测试:"<<endl<<str3;
str4=st;
cout<<"字符串赋值测试:"<<endl<<str4;
cout<<"输入流重载测试:"<<endl;
cin>>str3;
cout<<str3;
cout<<"逻辑等于测试1:";
if(str1==str5)cout<<"str1==str5"<<endl;
String str6("Pang Hongyu");
cout<<"逻辑等于测试2:";
if(str6=="Yao Jungyu")cout<<"String == C++ string"<<endl;
cout<<"逻辑等于测试3:";
if("Pang Hongyu"==str6)cout<<"C++ string==String"<<endl;
}
报错信息:
--------------------Configuration: 实验三 - Win32 Debug--------------------
Compiling...
main.cpp
f:\实验三\string.h(174) : error C2143: syntax error : missing ';' before '>'
f:\实验三\string.h(174) : error C2143: syntax error : missing ';' before '>'
f:\实验三\string.h(174) : error C2143: syntax error : missing ')' before '>'
f:\实验三\string.h(174) : error C2143: syntax error : missing ';' before '>'
f:\实验三\string.h(174) : warning C4552: '<' : operator has no effect; expected operator with side-effect
f:\实验三\string.h(174) : error C2059: syntax error : ')'
f:\实验三\string.h(175) : error C2146: syntax error : missing ';' before identifier 'cin'
执行 cl.exe 时出错.
实验三.exe - 1 error(s), 0 warning(s)
我想晕了...............................
[解决办法]
istream& operator > > (istream& istr,String& s) ///输入流操作符 > >重载
{
delete []s.str;
cout < <"输入字符串个数";
cin > >s.size;
s.maxSize=s.size+1;
s.str=new char[s.maxSize];
cout < <"输入字符串";
for(int i >0;i <s.size;i++)
cin > >s.str[i];
s.str[s.size]=NULL;
return istr;
}
for(int i >0;i <s.size;i++) 这有问题是不是int i=0;呢????
我运行你的程序只发现这出错了.其他地方没错啊!!
^_^
[解决办法]
把搂上的问题改过来就可以了
[解决办法]
单步调适.
如果用的是vc6.0你可以按F9进行设置断点.让后按F10进行一步一步调试.
详细可以看看vc++教程,有调试错误的书
