- 论坛徽章:
- 0
|
本帖最后由 numdisp 于 2010-04-30 05:30 编辑
如果不用sscanf,不用任何C的库,只用所谓“纯C++”的标准流库(或者加上其它"纯C++"的标准库),sscanf的等价实现怎样才能最简洁(包括写法和执行效率)?
譬如
char sz[] = "1, 2,3.14,,";
int m, n;
float x;
要正确从sz中提取m, n, x的话,用sscanf只要 sscanf(sz, "%d,%d,%f", &m, &n, &x) 就行了。
如果只用流库和 >> 操作符的话,怎么才能简单一点呢?
方法1. 简单地替换sz中所有的","为空格:
这个方法不等价,举例:如果 sz[] = “1, ,2,3.14”,sscanf会出错,而替换后的字符串为"1 2 3.14",用stringstream ss >> m >> n >> x不会出错。
方法2. 用ignore方法:
istringstream ss(sz);
ss >> m;
ss.ignore(1, ',');
ss >> n;
ss.ignore(1, ',');
ss >> x;
if (ss.fail())
{
cerr << "Error occurred!\n";
}
这个方法也不等价,举例:sz[] = "1 2 3.14",sscanf会出错,而方法2不出错。
方法3. 把 m, n, x 封装到一个struct里,或者class里,然后重载>>操作符。但是这样凭空多了一个class,而且离散的变量多一点的话,就更不方便了。
还有一个问题,就是sscanf可以通过判断返回值来确定有几个数已经被成功读入了,这个用sstream的话好像不太好办。
有没有什么简单而又高效一点的方法?这里“等价”的含义仅包括对字符串sz的处理(包括成功或失败时的行为,当然抛出异常和返回错误代码之类的区别是忽略的)。
纯讨论而已,认为没有意义或者说“既然可以用sscanf为什么不用”的人就不劳烦您回帖了。 |
|