在C++中分隔正斜杠的输入

sha*_*man 0 c++ input

让我先说一下我是C++的新手.

我想从一个以A/B形式输入的分数中获取分子和分母(在命令行中); 将A和B放入各自变量的最简单方法是什么?

Die*_*ühl 7

使用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 时,需要使用以避免问题.