从标准输入中读取文本,直到遇到确切的字符之一,然后保存它,然后继续阅读直到行尾

时间:2019-01-10 08:55:48

标签: c++

我想处理大数的基本运算(+,-,*,/)。我的标准输入行看起来像12345678987654322+12334675432142654765786。 因此,我想先将数字读入一个字符串变量,然后将操作符号读入另一个变量,然后继续读取直到行尾。

我当时正在考虑这样的事情,但是它只是跳过了“ +”,我不知道如何在此处包括4个条件(+,-,*,/)。

std::string firstNumber;
std::string secondNumber;

std::getline(std::cin, firstNumber, '+');
std::getline(std::cin, secondNumber);

2 个答案:

答案 0 :(得分:1)

将整行读取为字符串。

环绕字符串并逐个字符地提取。只要字符是数字,就将其放入第一个“数字”变量中。如果它是非数字,则检查它是否是有效的运算符,如果不是,则报告失败。将第二个数字逐个字符地提取到第二个“数字”变量中。

这样,您可以更轻松地检测错误,并处理数字和运算符之间的空格。

您可以(我建议您这样做)将数字提取功能放到一个单独的函数中,这样就不必为它重复代码了。

答案 1 :(得分:0)

您需要做一些工作,而不是依靠标准功能为您完成工作。一次读取一个字符并使用几个循环就可以轻松实现所需的内容

#include <cctype>
#include <string>
#include <iostream>

std::string firstNumber, secondNumber;
char operation, ch;

ch = std::cin.get();
while (isdigit((unsigned char)ch))
{
    firstNumber += ch;
    ch = std::cin.get();
}
operation = std::cin.get();
ch = std::cin.get();
while (isdigit((unsigned char)ch))
{
    secondNumber += ch;
    ch = std::cin.get();
}

此代码完全不执行错误检查,这在现实世界中的程序中将是一个严重的问题。

您被要求做的是一个解析问题。这是很常见的事情,并且有很多关于不同解析方式的文献。