让我先说这是我对C ++的新手。
我想从一个以A / B形式输入的分数中获取分子和分母(在命令行中);将A和B放入各自变量的最简单方法是什么?
答案 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,就像其他人已经证明的那样。