关于c++primer中的一个类类型String的问题。
我在Vc++6。0,dev-c++,gcc for windows中都编译过了,就是通不过。
我按照书上的源码如下,帮忙看看有什么问题没有啊:
#include<iostream>
#include<cstring>
#include<cassert>
#include<iomanip>
using namespace std;
class String;
istream& operator>>(istream&,String&);
ostream& operator<<(ostream&,const String&);
class String{
public:
String();
String(const char*);
String(const String&);
~String();
String& operator=(const String&);
String& operator=(const char*);
bool operator==(const String&);
bool operator==(const char*);
char& operator[](int);
int size(){return _size;}
char* c_str(){return _string;}
private:
int _size;
char *_string;
}
inline String::String()
{
_size=0;
_string=0;
}
inline String::String(const char*str)
{
if(!str)
{
_size=0;
_string=0;
}
else
{
_size=strlen(str);
_string=new char[_size+1];
strcpy(_string,str);
}
}
inline String::String(const String &rhs)
{
_size=rhs._size;
if(!rhs._string)
_string=0;
else
{
_string=new char[_size+1];
strcpy(_string,rhs._string);
}
}
inline String::~String(){delete [] _string;}
inline String&
String::operator=(const char *s)
{
if(!s)
{
_size=0;
delete [] _string;
_string=0;
}
else
{
_size=strlen(s);
delete [] _string;
_string=new char[_size+1];
strcpy(_string,s);
}
return *this;
}
inline String&
String::operator=(const String &rhs)
{
if(this!=&rhs){
delete [] _string;
_size=rhs._size;
if(!rhs._string) _string=0;
else{
_string=new char[_size+1];
strcpy(_string,rhs._string);
}
}
return *this;
}
inline bool
String::operator==(const String &rhs)
{
if(_size!=rhs._size)
return false;
return strcmp(_string,rhs._string)?false:true;
}
inline bool
String::operator==(const char*s)
{
return strcmp(_string,s)?false:true;
}
inline char&
String::operator[](int elem)
{
assert(elem>0&&elem<_size);
return _string[elem];
}
inline istream&
operator>>(istream &io,String &s)
{
const int limit_string_size=4096;
char inBuf[limit_string_size];
io>>setw(limit_string_size)>>inBuf;
s=inBuf;
return io;
}
inline ostream&
operator<<(ostream& os,String &s)
{
return os<<s.c_str();
}
int main()
{
int aCnt=0,eCnt=0,iCnt=0,oCnt=0,uCnt=0,theCnt=0,itCnt=0,wdCnt=0,notVowel=0;
String buf,the("the"),it("it");
while(cin>>buf){
++wdCnt;
cout<<buf<<' ';
if(wdCnt%12==0)
cout<<endl;
if(buf==the||buf=="The")
++theCnt;
else
if(buf==it||buf=="It")
++itCnt;
for(int ix=0;ix<buf.size();++ix)
{
switch(buf[ix])
{
case 'a':case 'A':++aCnt;break;
case 'e':case 'E':++eCnt;break;
case 'i':case 'I':++iCnt;break;
case 'o':case 'O':++oCnt;break;
case 'u':case 'U':++uCnt;break;
default:++notVowel;break;
}
}
}
cout<<"\n\n"
<<"Word read: "<<wdCnt<<"\n\n"
<<"the/The: "<<theCnt<<'\n'
<<"it/It: "<<itCnt<<"\n\n"
<<"not-vowels read: "<<notVowel<<"\n\n"
<<"a: "<<aCnt<<'\n'
<<"e: "<<eCnt<<'\n'
<<"i: "<<iCnt<<'\n'
<<"o: "<<oCnt<<'\n'
<<"u: "<<uCnt<<endl;
return 0;
}
我按照书上的源码如下,帮忙看看有什么问题没有啊:
#include<iostream>
#include<cstring>
#include<cassert>
#include<iomanip>
using namespace std;
class String;
istream& operator>>(istream&,String&);
ostream& operator<<(ostream&,const String&);
class String{
public:
String();
String(const char*);
String(const String&);
~String();
String& operator=(const String&);
String& operator=(const char*);
bool operator==(const String&);
bool operator==(const char*);
char& operator[](int);
int size(){return _size;}
char* c_str(){return _string;}
private:
int _size;
char *_string;
}
inline String::String()
{
_size=0;
_string=0;
}
inline String::String(const char*str)
{
if(!str)
{
_size=0;
_string=0;
}
else
{
_size=strlen(str);
_string=new char[_size+1];
strcpy(_string,str);
}
}
inline String::String(const String &rhs)
{
_size=rhs._size;
if(!rhs._string)
_string=0;
else
{
_string=new char[_size+1];
strcpy(_string,rhs._string);
}
}
inline String::~String(){delete [] _string;}
inline String&
String::operator=(const char *s)
{
if(!s)
{
_size=0;
delete [] _string;
_string=0;
}
else
{
_size=strlen(s);
delete [] _string;
_string=new char[_size+1];
strcpy(_string,s);
}
return *this;
}
inline String&
String::operator=(const String &rhs)
{
if(this!=&rhs){
delete [] _string;
_size=rhs._size;
if(!rhs._string) _string=0;
else{
_string=new char[_size+1];
strcpy(_string,rhs._string);
}
}
return *this;
}
inline bool
String::operator==(const String &rhs)
{
if(_size!=rhs._size)
return false;
return strcmp(_string,rhs._string)?false:true;
}
inline bool
String::operator==(const char*s)
{
return strcmp(_string,s)?false:true;
}
inline char&
String::operator[](int elem)
{
assert(elem>0&&elem<_size);
return _string[elem];
}
inline istream&
operator>>(istream &io,String &s)
{
const int limit_string_size=4096;
char inBuf[limit_string_size];
io>>setw(limit_string_size)>>inBuf;
s=inBuf;
return io;
}
inline ostream&
operator<<(ostream& os,String &s)
{
return os<<s.c_str();
}
int main()
{
int aCnt=0,eCnt=0,iCnt=0,oCnt=0,uCnt=0,theCnt=0,itCnt=0,wdCnt=0,notVowel=0;
String buf,the("the"),it("it");
while(cin>>buf){
++wdCnt;
cout<<buf<<' ';
if(wdCnt%12==0)
cout<<endl;
if(buf==the||buf=="The")
++theCnt;
else
if(buf==it||buf=="It")
++itCnt;
for(int ix=0;ix<buf.size();++ix)
{
switch(buf[ix])
{
case 'a':case 'A':++aCnt;break;
case 'e':case 'E':++eCnt;break;
case 'i':case 'I':++iCnt;break;
case 'o':case 'O':++oCnt;break;
case 'u':case 'U':++uCnt;break;
default:++notVowel;break;
}
}
}
cout<<"\n\n"
<<"Word read: "<<wdCnt<<"\n\n"
<<"the/The: "<<theCnt<<'\n'
<<"it/It: "<<itCnt<<"\n\n"
<<"not-vowels read: "<<notVowel<<"\n\n"
<<"a: "<<aCnt<<'\n'
<<"e: "<<eCnt<<'\n'
<<"i: "<<iCnt<<'\n'
<<"o: "<<oCnt<<'\n'
<<"u: "<<uCnt<<endl;
return 0;
}
...全文
相关推荐
C++_Primer_Plus(第五版)习题解答和例题代码
**字符串处理** - C++中的字符串:C++标准库提供了std::string类型,方便处理字符串操作。 - C风格字符串:以空字符'\0'结尾的字符数组,需谨慎处理内存和长度。10.
New Delete
在C++ Primer中,“New Delete”章节详细讲解了如何使用new和delete操作符来分配和释放动态内存,以及在此过程中可能遇到的问题和最佳实践。
C++primer全书笔记
字符串在C++中是一个特殊的字符数组,用来处理文本信息。string类是C++标准库提供的一个类,提供了更高级的字符串操作功能。
C++ Primer笔记
在C++编程语言的学习过程中,C++ Primer是一本非常经典的教材。这本笔记主要涵盖了书中的基础部分,便于学习者快速查阅和理解。下面将详细阐述笔记中的几个关键知识点。
如何打造一款三消类游戏
样式繁多的“消消乐”游戏想必大家都不陌生,通关秘籍就是将三个或更多相同的元素配对消除,通常我们称这类游戏为“三消”游戏。Shopee 购物平台内嵌的三消游戏 Shopee Candy 也受到了不少用户的喜爱,这篇文章将带你从项目起源、游戏架构和项目工具集等方面了解如何打造一款这样的三消小游戏。


