使用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 次 |
最近记录: |