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

时间:2012-10-18 18:21:27

标签: c++ input

让我先说这是我对C ++的新手。

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

4 个答案:

答案 0 :(得分:7)

使用C ++最简单的方法是

double numerator, denominator;
char   dummy;
if (in >> numerator >> dummy >> denominator) {
    // ...
}

以上从流中读取合理值。要从命令行的参数获取流,您需要使用std::istringstream

int main(int ac, char* av[]) {
    for (int i(1); i != ac; ++i) {
        std::istringstream in(av[i]);
        // ...
    }
}

主要缺点是分离字符可以是具有上述提取代码的任何字符。要解决这个问题,我会使用slash操纵器:

std::istream& slash(std::istream& in) {
    if (in.get() != '/') {
        in.setstate(std::ios_base::failbit);
    }
    return in;
}
// ...
if (in >> numerator >> slash >> denominator) {
    // ...
}

由于这个解决方案似乎很受欢迎,我想指出,根据需要,您可能需要稍微调整slash()的实现:发布的版本需要在分子后面的斜杠。跳过前导空格可能是合理的:

if ((in >> std::ws).get() != '/') {
    ...
}

此外,这只是一个字符的特殊实现,您可能希望为其他字符设置类似的操作符。为避免复制代码,操纵器可以成为模板:

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<','>;
// ...

当使用带有负值的std::char_traits<char>::to_int_type()时,需要使用char来避免出现问题。

答案 1 :(得分:2)

scanf。即使在C ++中,它仍然有效。请注意,变量名称应以小写开头。

int a, b;
scanf("%d/%d", &a, &b);

答案 2 :(得分:0)

命令行参数作为C字符串(即字符指针)传递。如果您有一个程序的基本框架,那么您已经拥有......

void main(int argc, char * argv[])
{ ... }

......或类似的东西。 argv数组的第一个成员(即argv [0])是指向正在运行的程序名称的字符指针。其余参数(argv [1] thru argv [argc-1])是命令行参数。

如果您只是学习c / c ++,那么您应该在调试器下运行一个基本的简单程序,传递不同的参数,使用空格引用任何参数,使用环境变量作为参数,然后尝试查看真正传递的内容。

当你这样做时,使用你的A / B作为参数。它将是一个字符串而不是数字,因此您需要在“/".

处进行划分
int a, b;
scanf("%d/%d", &a, &b);
只要您的数字和斜杠都一起运行以构成一个参数,

就会起作用。 shell通常会使用空格来分隔不同的参数。

您可以使用其他方法查找斜杠和值。你的问题的答案不一定要特定于c ++。 Scanf适用于c / c ++。另一种简单的方法是......

char *copyOfString = strdup(argv[1]);
char *B = strchar(copyOfString, '/');
*B = NULL;
B++;
char *A = copyOfString;

现在你有了需要转换为整数的值的字符串形式(或浮点数或双精度,取决于你的要求)。当然,没有错误检查,所以如果你没有完全正确地调用程序,那么程序化的混乱就会随之而来。

其他人已经为其他方法发布了其他答案,但我希望这有助于并欢迎使用c / c ++编程。请得到一本好书,试验和错误只是到目前为止,C / C ++是非常无情的。

答案 3 :(得分:-1)

-Removed-By Poster没有用命令行完成答案。

在你从std中读取字符串后,将字符串查找为strtok,就像其他人已经证明的那样。