0

让我先说我对 C++ 真的很陌生。

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

4

4 回答 4

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

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

于 2012-10-18T18:33:03.350 回答
2

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

int a, b;
scanf("%d/%d", &a, &b);
于 2012-10-18T18:29:15.063 回答
0

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

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

...或类似的东西。argv 数组的第一个成员(即 argv[0])是一个字符指针,指向正在运行的程序的名称。其余参数(argv[1] 到 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++ 非常无情。

于 2012-10-18T18:44:42.163 回答
-1

-Removed-By 未使用命令行完成答案的海报。

就像其他人所展示的那样,一旦您从 std in 中读取它,就拆分字符串查找 strtok 。

于 2012-10-18T18:33:01.193 回答