c++: 用cin读string遇到的问题
程序功能:输入一串字符串,计算出总的词的个数和the出现次数数和a出现次数
问题:进入 while(cin>>buf){后不会跳出循环
String.cpp
1 #include<iostream>
2 #include"String.h"
3 using namespace std;
4
5 int main(){
6 int aCnt=0, theCnt=0,wdCnt=0;
7 String buf, the("the");
8 while(cin>>buf){
9 ++wdCnt;
10 cout<<buf<<'\n';
11
12 if(buf==the||buf=="The") ++theCnt;
13 for(int ix=0;ix<buf.size();++ix){
14 switch(buf[ix]){
15 case 'a':case 'A': ++aCnt;break;
16 default:break;
17 }
18 }
19 }
20 cout<<"\n"<<wdCnt<<"\na:"<<aCnt<<"\nthe:"<<theCnt<<endl;
}
String.h
#include<cstring>
#include<iostream>
#include<cassert>
#include<iomanip>
using namespace std;
class String;
inline istream& operator>>(istream&, String&);
inline 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 char* s){
return strcmp(_string, s)?false:true;
}
inline bool String::operator==(const String& rhs){
if(_size!=rhs._size) return false;
return strcmp(_string, rhs._string)?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 &io, String& s){
return io<<s.c_str();
}