istringstream in("4.2 + 3.4 - 4.1");
ostringstream out;
string sign;
double num;
double tempNum = 0;
double sum = 0;
while (in >> num >> sign) {
tempNum = num;
if (sign == "+") {
sum = (num + tempNum);
}
}
cout << sum << endl;
我的输出:8.4
正确输出:3.5
我想将4.2存储到tempNum中并将3.4读入num中,这样我就可以将8.4和3.4添加到总和中。但是,我遇到的问题是每当它读取4.2时,它将4.2分配给num,然后它读取3.4并将3.4分配给tempNum。如何将4.2分配到tempNum中,并将3.4仅保留在num变量中。所以我可以得到4.2 + 3.4,而不是4.2 + 4.2。如果问题不明确,我想更详细地解释一下。
答案 0 :(得分:3)
您拥有的代码存在多个问题。如何解决原先陈述的问题已经得到解答。我在评论中提到的另一个问题。但到目前为止,没有一个解决了阅读数字和&#34;标志的问题。串行,我将在这里展示。
你需要考虑的第一件事是输入是一系列数字和&#34;标志&#34;一个接一个。虽然你是正确的,需要一个循环,你还需要考虑实际的序列...你有一个数字,后跟一个符号后跟另一个数字等。
解决这个问题的简单方法是稍微改变一点。它不是以数字开头的序列。相反,将它视为一个孤独的数字,然后是一个可选的序列&#34;标志&#34;和数字。
然后你可以做类似
的事情in >> sum;
while (in >> sign >> num)
{
if (sign == "+")
{
sum += num;
}
else if (sign == "-")
{
sum -= num;
}
}
当输入只是一个数字时,上面的循环将处理这种情况。或者在他们之间使用+
或-
的任意数量的数字。
但是仍然无法正确处理乘法和除法之类的事情。为此,您需要另一种更复杂的方法。
答案 1 :(得分:2)
您再也不会从流中读取数据,只是使用相同的第一个数字两次。在行tempNum = num
之后,您可能意味着应该读取新的数字:
in >> num;
请注意,打开监视窗口的逐步调试过程非常适合处理此类问题。
UP :整个代码如下所示:
istringstream in("4.2 + 3.4");
ostringstream out;
string sign;
double num;
double tempNum = 0;
double sum = 0;
while (in >> num >> sign) {
tempNum = num;
in >> num;
if (sign == "+") {
sum = (num + tempNum);
}
}
cout << sum << endl;
答案 2 :(得分:1)
对于简单的情况,您可以使用不带while循环的流提取运算符。像这样
in >> x >> sign >> y;
以下是完整示例
std::istringstream in("4.2 + 3.4");
std::string sign;
double x, y;
in >> x >> sign >> y;
std::cout << x << std::endl;
std::cout << sign << std::endl;
std::cout << y << std::endl;
double sum = x + y;
std::cout << sum << std::endl;
如果输入变得更复杂,请尝试像这样的while循环
std::istringstream in("4.2 + 3.4 - 4.1");
std::string temp;
double op; //for + becomes 1.0 for - becomes -1.0
double sum = 0;
in >> sum; //Get the first value
while (in >> temp) {
//check for operator
if (temp == "+") {
op = 1.0;
}
else if (temp == "-") {
op = -1.0;
}
else {
double next = std::stod(temp,NULL);
sum += op * next;
}
}