使用C++最简单的方法是
double numerator, denominator;
char dummy;
if (in >> numerator >> dummy >> denominator) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
以上从流中读取合理值.要从命令行的参数获取流,您将使用std::istringstream:
int main(int ac, char* av[]) {
for (int i(1); i != ac; ++i) {
std::istringstream in(av[i]);
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
主要缺点是分离字符可以是具有上述提取代码的任何字符.要解决这个问题,我会使用一个slash操纵器:
std::istream& slash(std::istream& in) {
if (in.get() != '/') {
in.setstate(std::ios_base::failbit);
}
return in;
}
// ...
if (in >> numerator >> slash >> denominator) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
由于这个解决方案似乎很受欢迎,我想指出,根据需要,您可能需要稍微调整一下实现slash():发布的版本需要在分子后面的斜杠.跳过前导空格可能是合理的:
if ((in >> std::ws).get() != '/') {
...
}
Run Code Online (Sandbox Code Playgroud)
此外,这只是一个字符的特殊实现,您可能希望为其他字符设置类似的操作符.为避免复制代码,操纵器可以成为模板:
template <char Separator>
std::istream& separator(std::istream& in) {
if ((in >> std::ws).get() != std::char_traits<char>::to_int_type(Separator) {
// ...
}
typedef std::istream& (*separator_manipulator)(std::istream&);
separator_manipulator const slash = &separator<'/'>;
separator_manipulator const comma = &separator<','>;
// ...
Run Code Online (Sandbox Code Playgroud)
std::char_traits<char>::to_int_type()当使用char具有负值的s 时,需要使用以避免问题.
| 归档时间: |
|
| 查看次数: |
3793 次 |
| 最近记录: |