请问高手一个函数
写一个转换操作符,把一个字符串转换成整数值,它跳过空格键,搜寻字符串中的第一个数字,把这个数字及其所有紧跟其后的数字都转换成整数值,然后省略剩余的字符,因此下列任一个串都产生值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




