在实践证实之前,不要想当然你是对的啊,请高人看看这个问题

hyifeng 2003-06-01 11:22:25
int i1, i2, i3;
cin >> i1 >> i2 >> i3;
cout << i1 << ' ' << i2 << ' ' << i3;

应该怎样做,令我在控制台输入:
29,87,100
能正确输出:
29 87 100
...全文
6 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hyifeng 2003-06-01
是啊,我就是想找一个方法能用其他字符(代替' ')做界分符。
我曾经参考过i/o stream的国际化,
比如(引用书上一段比喻)德国的本地化的小数表示13,4(等效于标准c风格13.4),
德国的确是用 逗号 作小数点。
也就是使用德国本地化后
float price;
cin >> price;

在控制台输入:
13,40
那么 price == 13.40

我想我是否可以用这些办法(或者stream本身提供方法)设置','做界分符。

up up up
回复
晨星 2003-06-01
这就难办了(我是说直接读的话),因为“,”也是字符,读整数可以不理会它,读字符串可不能不理会它。
我觉得要么你重新设计你的输入方式,要么你全部读进来自己处理,否则,万一待会儿你又想用“a”、“b”或者汉字做分隔符怎么办?^_^
回复
hyifeng 2003-06-01
谢谢steedhorse(晨星)指点,

但如果是这样又如何?
string s1,s2,s3
cin >> s1 >> s2 >> s3;
cout << s1 << ' ' << s2 << ' ' << s3;

同样是那个要求。
其实我是想用','代替' '的功能。

让输入
XXX,XXX,XXX
效果等同于
XXX XXX XXX
回复
qibo999 2003-06-01
转换成字符输出就可以了。
回复
晨星 2003-06-01
int i1, i2, i3;
char c1 , c2;
cin >> i1 >> c1 >> i2 >> c2 >> i3;
cout << i1 << ' ' << i2 << ' ' << i3;
回复
hyifeng 2003-06-01
我事先看过,找不到办法才来问的,
回复
liuyuw 2003-06-01
找本有关C++ io流的书来看
回复
chinajiji 2003-06-01
方法四:

#include <iostream>
#include <cstdlib>
#include <sstream>
#include <string>
using namespace std;

int main() {
int i1, i2, i3;
stringstream s;
string str;
while( getline(cin, str, ',') )
s << str << ' ';
s >> i1 >> i2 >> i3;
cout << i1 << ' ' << i2 << ' ' << i3;
system("pause");
return 0;
}

//按ctrl + z结束输入(windows平台下)
回复
chinajiji 2003-06-01
方法三:

#include <iostream>
#include <sstream>
#include <cstdlib>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

char change(char c) {
if (c == ',')
return ' ';
return c;
}

int main() {
int i1, i2, i3;
string str;
istreambuf_iterator<char> isb(cin), end;
transform(isb, end, back_inserter(str), change);
stringstream s(str);
s >> i1 >> i2 >> i3;
cout << i1 << ' ' << i2 << ' ' << i3 << endl;
system("pause");
return 0;
}

//按ctrl + z结束输入(windows平台下)
回复
chinajiji 2003-06-01
方法一:
#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
int i1, i2, i3;
cin >> i1;
cin.ignore(1);
cin >> i2;
cin.ignore(1);
cin >> i3;
cout << i1 << ' ' << i2 << ' ' << i3;
system("pause");
return 0;
}
方法二:
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <string>
#include <functional>
#include <algorithm>
using namespace std;

int main() {
int i1, i2, i3;
string str;
cin >> str;
replace_if(str.begin(), str.end(),
not1(bind2nd( not_equal_to<char>(), ',')), ' ');
stringstream s(str);
s >> i1 >> i2 >> i3;
cout << i1 << ' ' << i2 << ' ' << i3 << endl;
system("pause");
return 0;
}
如果用C来实现就更简单了.
回复
hyifeng 2003-06-01
^_^
回复
晨星 2003-06-01
呵呵,我只是瞎说而已。
不过你千万别听了我的话,就走到另一个极端去啊,能滚瓜烂熟地使用各种库可是提高开发效率的关键,^_^

——前几天看到一个同学在那里手工编写一个将整数转换成16进制字符串的程序,编就编呗,无可厚非,可他非要在人前炫耀,还说功能如何如何强大,结果我告诉他其实sprintf能够实现的16进制转换功能,比他的强大多了。^_^
回复
hyifeng 2003-06-01
谢谢 steedhorse(晨星) 热情的指导。
回复
hyifeng 2003-06-01
"但当你陷入库函数提供的功能中不能自拔的时候,"
"回头一看,往往会发现手工方法才是最好的方法。"

金石良言!!
回复
晨星 2003-06-01
这是完全可以的。但不能直接实现。你先把整行字符串读进来(使用cin.getline),分成一个一个的子串(可以自己编函数实现),替换掉想以国内的字符(如“,”换成“.”),然后把使用atof把相应字符串转换成数值类型。

看似麻烦了点,但当你陷入库函数提供的功能中不能自拔的时候,回头一看,往往会发现手工方法才是最好的方法。
回复
发帖
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
帖子事件
创建了帖子
2003-06-01 11:22
社区公告
暂无公告