怎么实现String类的operator>>

danny1221 2008-03-14 10:18:50
class String {
friend istream& operator>> ( istream& is, String& s ); // 如何实现
public:
String( );
String( const char* s );
String( const String& s );
~String( );
size_t length( ) const { return m_length; }
private:
char* m_data;
size_t m_length;
};
...全文
250 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
问题在于这个数组该设置多长呢?
xbt746 2008-03-14
  • 打赏
  • 举报
回复
不知道,学习来的
baihacker 2008-03-14
  • 打赏
  • 举报
回复
先放到一个数组里,然后计算长度,最后将s中以前的数据清理了,重新分配内存,并把数组里的数据copy进重新分配的内存...
danny1221 2008-03-14
  • 打赏
  • 举报
回复
istream& operator>> ( istream& is, String& s )
{
const istream::sentry ok( is );
if( ok ) {
char c = is.rdbuf()->sgetc();
size_t _size = UINT_MAX;
s.make_empty( );

for( ; 0 < _size && !is.eof(); --_size, c = is.rdbuf()->snextc() )
if( isspace( c ) ) // skip whitespace
break;
else
s.append( c ); // 自己实现append
}
return is;
}

这是参考VC2008自带string的operator>>实现的超级简化版。
谢谢各位的回答。
Supper_Jerry 2008-03-14
  • 打赏
  • 举报
回复
friend istream& operator>> ( istream& is, String& s )
{
char cInput[128];
is>>cInput;
s.m_length=strlen(cInput);
if(s.m_data)
{
delete s.m_data;
s.data = NULL;
}、、应该需要delete一下吧
s.m_data=new char[s.m_length+1];
strcpy(s.m_data, cInput);

return is;
}
Ronal_Lee 2008-03-14
  • 打赏
  • 举报
回复

这样就应该可以
istream &operator>>(istream &i, String &s)
{
char str[100];
i >> str;
int length = strlen(str);
delete s.m_cData;

s.m_cData = new char[length+1];

strcpy(s.m_cData, str);
return i;
}
ryfdizuo 2008-03-14
  • 打赏
  • 举报
回复
#include <iostream>
#include <string.h>
using namespace std;

#define SAFE_DELETE(p) { if(p!=0){delete p; p = NULL;}}
class String
{
friend istream& operator>> ( istream& is, String& s )
{
char cInput[128];
is>>cInput;
s.m_length=strlen(cInput);
s.m_data=new char[s.m_length+1];
strcpy(s.m_data, cInput);

return is;
}
friend ostream& operator<< ( ostream& os, String& s )
{
os<<s.m_data<<endl;
return os;
}
public:
String():m_data(NULL), m_length(0)
{}
String( const char* s ):m_length(strlen(s)), m_data(NULL)
{
m_data=new char[m_length+1];
strcpy(m_data, s);
}

String( const String& s ):m_length(s.Getlength()), m_data(NULL)
{
m_data=new char[m_length+1];
strcpy(m_data, s.m_data);
}
~String()
{
SAFE_DELETE(m_data);
m_length=0;
}
size_t Getlength() const { return m_length; }
private:
char* m_data;
size_t m_length;
};

int main()
{
String test;
cin>>test;
cout<<test.Getlength()<<endl;
cout<<test;
return 0;
}

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧