CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

请问高手一个函数

楼主DENGGUOGANG()2006-10-18 12:32:37 在 C/C++ / C++ 语言 提问

写一个转换操作符,把一个字符串转换成整数值,它跳过空格键,搜寻字符串中的第一个数字,把这个数字及其所有紧跟其后的数字都转换成整数值,然后省略剩余的字符,因此下列任一个串都产生值12:       "12"     "12     4"     "12AAS" 问题点数:50、回复次数:21Top

1 楼doudouHuY()回复于 2006-10-18 13:04:36 得分 0

这个再不行你也可以一个个分析得呀?Top

2 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-18 13:07:46 得分 0

这个,要写嘛  
  istringstream是现成的呀  
  比如istringstream   in("12   4");  
  int   i;  
  in   >>   i;  
  已经完成了呀。Top

3 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-18 13:11:59 得分 0

什么叫转换操作符呀?C++除了重载之外允许自定义操作符吗?Top

4 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-18 13:19:07 得分 0

lann64(昆仑大鹏),当然可以啊,你看的书不够多了呀。  
  比如  
  struct   T  
  {  
  operator   int(){return   i;}  
  int   i;  
  }  
  T   t;  
  t.i   =   10;  
  int   i   =   t;Top

5 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-10-18 13:23:31 得分 0

#include   <sstream>  
  #include   <iostream>  
  //#include   <list>  
  //#include   <string>  
  //#include   <algorithm>  
  using   namespace   std;  
  template<class   T>  
  string   tostring(T   t)  
  {  
  ostringstream   os;  
  os<<t;  
  return   string(os.str());  
  }    
  template<class   T>  
  T   fromstring(string   s)  
  {  
  T   t;  
  istringstream   is(s);  
  is>>t;  
  return   t;  
  }    
   
  int   main()  
  {  
  //           ""  
  int   x1=fromstring<int>("12");//12  
  int   x2=fromstring<int>("   12     4");//12  
  int   x3=fromstring<int>("12AAS");//12  
          double   d=fromstring<double>("12.33AAS");//12.33  
  return   0;  
  }Top

6 楼Jokar(贪睡鼠)回复于 2006-10-18 13:26:31 得分 0

顶   taodm~  
  ps:大鸟好~   黄瓜好~Top

7 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-18 13:31:31 得分 0

taodm(taodm)  
  谢谢,不过()还只能算重载,还能新定义一个操作符吗?比如定义运算符@或@#?Top

8 楼huangyangman(庸人自扰)回复于 2006-10-18 13:34:49 得分 0

转换是指类转换吧,  
  构造函数也有这个功能.  
  学习中~Top

9 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-18 13:42:14 得分 0

新创建出的运算符是operator   int,而不是()。  
  重载()的形式是   ReturnType   operator()(ParaList)。  
  C++可以自己增加的只有转换运算操作。Top

10 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-18 13:45:12 得分 0

非常感谢taodm(taodm)Top

11 楼Jim_King_2000()回复于 2006-10-18 14:22:00 得分 0

去看atoi的源代码。Top

12 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-18 14:35:03 得分 0

那楼主的问题是否可以这样  
  class   T    
  {  
  public:  
   
  T(){i=0;}  
  T(string   s){i=token(s);}  
  T   operator   =(string   s)   {i=token(s);return   *this;}  
                    operator   int(){return   i;}  
  private:  
        int   token(string   s)  
        {  
        int   sum=0,p=0;  
        int   len=s.size();  
        while   ((p<len)&&(!isdigit(s[p])))   p++;  
        while   ((p<len)&&(isdigit(s[p])))  
        sum=sum*10+s[p++]-'0';  
        return   sum;  
        }  
        int   i;  
  };  
  这样"12","12   ","12as","as12"都可以用了。  
  Top

13 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-18 15:01:59 得分 0

to   lann64(昆仑大鹏)   ,如果是要支持16进制了,你又怎么写?  
  还是借助istringstream吧。能不用自己写的代码就别自己写。  
          istringstream   str_stream(s);  
          if   ((s[0]   ==   '0')   &&   ((s[1]   ==   'x')   ||   (s[1]   ==   'X')))  
          {  
                  str_stream   >>   std::hex;  
          }  
   
          int   r   =   0;  
          str_stream   >>   r;  
  Top

14 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-18 15:12:27 得分 0

10进制16进制都支持只好改写函数了。:(  
  不过直接用istringstream有一个问题,对字符开头的字符串不正确,如“a23ab”。  
  另外如果对"12   4"要输出124而不是12,那也只好用自己写的了。  
  (把while   ((p<len)&&(isdigit(s[p])))  
        sum=sum*10+s[p++]-'0';  
  改成:  
  while   ((p<len)&&(isdigit(s[p])))  
        {  
  sum=sum*10+s[p++]-'0';  
  while   ((p<len)&&(s[p]=='   '))   p++;  
        }  
  )就成了。Top

15 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-18 15:32:58 得分 0

按他的要求,a23ab是应该转换不成功,12   4他就要12呀。  
  你的代码当然要能同时处理10进制和16进制才好呀。Top

16 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-18 15:43:24 得分 0

总之,谢谢了。还是学到不少东西。Top

17 楼OOPhaisky(异化$渴望成功~~)回复于 2006-10-18 16:41:45 得分 0

楼主如果想原创,那就扫描一遍字符串就可以了^_^Top

18 楼piaozhou_cd(漂舟)回复于 2006-10-18 17:06:42 得分 0

请使用标准库的   long   strtol(   const   char   *nptr,   char   **endptr,   int   base   );  
  nptr       :   Null-terminated   string   to   convert    
  endptr   :   Pointer   to   character   that   stops   scan    
  base       :   Number   base   to   use    
   
  示例代码请到MSDN查看。  
  如要strtol的源码,请查阅开源编译器的标准C库源码。  
  Top

19 楼wcwjwy()回复于 2006-10-18 17:59:29 得分 0

不错  
  Top

20 楼DENGGUOGANG()回复于 2006-10-18 21:57:03 得分 0

谁能写一个完整一点的,能输入与输出结果Top

21 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-10-18 21:58:49 得分 0

#include   <iostream>  
  using   namespace   std;  
   
  class   T    
  {  
  public:  
   
  T(){i=0;}  
  T(const   char*   p){   string   s(p);i=token(s);}  
  T   operator   =(const   char*   p)   {string   s(p);i=token(s);return   *this;}  
  operator   int(){return   i;}  
  private:  
        int   token(string   s)  
        {  
        int   sum=0,p=0;  
        int   len=s.size();  
        while   ((p<len)&&(!isdigit(s[p])))   p++;  
        while   ((p<len)&&(isdigit(s[p])))  
        {  
  sum=sum*10+s[p++]-'0';  
  while   ((p<len)&&(s[p]=='   '))   p++;  
        }  
        return   sum;  
        }  
        int   i;  
  };  
   
  int   main()  
  {  
  T   t1("12a");  
  T   t2;  
  t2="12   4";  
  T   t3=t1;  
  T   t4="as56";  
   
  cout<<t1<<"   "<<t2<<"   "<<t3<<"   "<<t4<<endl;  
  cout<<12+t1<<endl;  
  }  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:DENGGUOGANG

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo