我试图创建一个程序,该程序接受由自然数字组成的字符串并计算它们的总和。像1+4
,43+986
等等
这是代码:
char s[100] = "39+72+15";
int main()
{
while(strlen(s) != 0)
{
i = 0;
while((s[i] != '+') && (s[i] != '-'))
{
temp = temp * 10 + (s[i] - '0');
i++;
}
cout << "temp = " << temp << endl;
strcpy (s, s + i + 1);
temp = 0;
}
return 0;
}
但是,无论我输入什么字符串值:
无论字符串中的最后一个数字如何,它都会将字符串中的最后一个数字转换为1877688504
。
我确定字符串的其余部分是空的,因此其中没有任何可能导致问题的垃圾。
有什么想法吗?
答案 0 :(得分:0)
您需要在内部while循环中添加对字符串末尾的检查。
目前您检查+或 - 但最后一个号码后面没有加号或减号。
更改
while((s[i] != '+') && (s[i] != '-'))
到
while((s[i] != '+') && (s[i] != '-') && s[i] != '\0') // '\0' is string terminator
应该解决你的问题。
答案 1 :(得分:0)
这是一种粗略的 C++
标记代数表达式的方式:
// Example program
#include <iostream>
#include <string>
#include <queue>
int main()
{
std::string ex = "39+72+15";
std::queue<std::string> operand_stack;
std::queue<std::string> operator_stack;
// tokenize
size_t ppos = 0;
size_t cpos = 0;
for (auto i = ex.begin();; ++i) {
if (*i == '+' || *i == '-') {
cpos = i - (ex.begin() + ppos);
std::string operand = ex.substr(ppos, cpos);
ppos = cpos + 1; // skip operator
operand_stack.push(operand); // push integer operand
std::string op(1, *i);
operator_stack.push(op); // push operator: "+" or "-"
} else if (i == ex.end()) {
ppos = i - (ex.begin() + ppos) + 1; // skip operator
// get last operand
std::string operand = ex.substr(ppos, ex.length() - ppos);
operand_stack.push(operand);
break;
}
}
// Assuming L->R, same precedence
while (! operator_stack.empty()) {
std::string op = operator_stack.front();
operator_stack.pop();
int lhs = std::stoi(operand_stack.front());
operand_stack.pop();
int rhs = std::stoi(operand_stack.front());
operand_stack.pop();
if (op == "+") {
operand_stack.push(std::to_string(lhs + rhs));
} else if (op == "-") {
operand_stack.push(std::to_string(lhs - rhs));
}
}
std::cout << "sum = " << operand_stack.front();
}