Как в С++ производится сложение строк? В чем пробела моего кода?

Как в С++ производится сложение строк? В чем пробела моего кода? Вот его кусок:
int Claculation() ...

s = "2+2";
s += "=" + Calculation(); //В итоге выходит, что s = "2+2pause", желая Calculation отдаёт 4.


Полный код:


includelt;iostreamgt;
includelt;stringgt;
includelt;cstringgt;
includelt;vectorgt;
includelt;cstdlibgt;
includelt;algorithmgt;
includelt;mapgt;
includelt;setgt;using namespace std;int Factorial(int a)

return a == 0 ? 1 : Factorial(a - 1) * a;
bool ExcessBrackets(string s) //Поправить так, чтоб удаление излишних скобок происходило за 1 цикл

int inBrackets = 0;
bool end = false;
for (int i = 1; i lt; s.length() - 1; i++)

inBrackets += s[i] == '(' ? 1 : s[i] == ')' ? -1 : 0;
if (inBrackets lt; 0)
end = true;

return inBrackets == 0 amp;amp; !end amp;amp; s.length() gt; 0 amp;amp; s[0] == '(' amp;amp; s[s.length() - 1] == ')';
vectorlt;stringgt; Parsing(string s)

vectorlt;stringgt; parse;
int inBrackets = 0;
string s1 = "";
for (int i = 0; i lt; s.length(); i++)

if (s[i] == '(')
inBrackets++;
if (s[i] == ')')
inBrackets--;
if (inBrackets gt; 0 s[i] != '+' amp;amp; s[i] != '*' amp;amp; s[i] != '-' amp;amp; s[i] != '/')
s1.push_back(s[i]);
else

parse.push_back(s1);
parse.push_back(string(1, s[i]));
s1 = "";


parse.push_back(s1);
return parse;
int Calculation(string s); //Необходимо для рекурсивного вызова Calculation -gt; Framework -gt; Calculation. Как поправить?int Framework(string s)

if (toupper(s[0]) == 'C')

int inBrackets = 0; //Надо ли здесь проверять скобки?
string n = "", k = "";
for (int i = 2; i lt; s.size(); i++)
if (s[i] == ',' amp;amp; inBrackets == 0)

n = s.substr(2, i - 2);
k = s.substr(i + 1, s.size() - i - 2);
break;

else
inBrackets += s[i] == '(' ? 1 : s[i] == ')' ? -1 : 0;
return Factorial(Calculation(n)) / Factorial(Calculation(k)) / Factorial(Calculation(n + "-" + k));

if (all_of(s.begin(), s.end(), ::isdigit))
return stoi(s);
cout lt;lt; "Error";
exit(0);
int Calculation(string s)

while (ExcessBrackets(s)) //Удаление излишних наружных скобок: (s) =gt; s. Нужно для Parsing
s = s.substr(1, s.length() - 2);
vectorlt;stringgt; parse = Parsing(s);
int firstm = -1; //Нужна в последующем цикле для варианта (a * b) * c =gt; ((a * b) * c) (запомнает положение самой левой скобки в ряде творений и разделений)
for (int i = 1; i lt; parse.size(); i += 2) //Расстановка скобок для операций * и /, идущих подряд, чтоб правильно брать производную типа: a * b * c =gt; (a * b) * c
if (parse[i] == "*" parse[i] == "/") //Учитывать, что может быть унарный знак

if (firstm == -1)
firstm = i - 1;
parse[i + 1] += ")";
parse[firstm] = "(" + parse[firstm];

s = "";
for (int i = 0; i lt; parse.size(); i++)
s += parse[i];
while (ExcessBrackets(s)) //Если были только умножения
s = s.substr(1, s.length() - 2);
parse = Parsing(s);
if (parse.size() == 1)
return Framework(parse[0]);
if (parse[0] == "-" parse[0] == "+")
parse.insert(parse.begin(), "0");
int rez = Calculation(parse[0]);
for (int i = 0; i lt; parse.size() - 1; i += 2) //Проверить два попорядку идущих знака
if (parse[i + 1] == "-")
rez -= Calculation(parse[i + 2]);
else if (parse[i + 1] == "+")
rez += Calculation(parse[i + 2]);
else if (parse[i + 1] == "*")
rez *= Calculation(parse[i + 2]);
else if (parse[i + 1] == "/")

int divider = Calculation(parse[i + 2]);
if (divider == 0) //Проверка на деления на ноль

cout lt;lt; "Error";
exit(0);

rez /= divider;

else //Если после числа идет не знак

cout lt;lt; "Error";
exit(0);

return rez;
void Print(string s)

maplt;char, vectorlt;stringgt;gt; symbols = '1', "",
"",
"",
"",
"" , '2', "",
" ",
"",
" ",
"" , '3', "",
" ",
"",
" ",
"" , '4', " ",
" ",
"",
" ",
" " , '5', "",
" ",
"",
" ",
"" , '6', "",
" ",
"",
" ",
"" ,
'7', "",
" ",
" ",
" ",
" " , '8', "",
" ",
"",
" ",
"" , '9', "",
" ",
"",
" ",
"" , '0', "",
" ",
" ",
" ",
"" , '+', " ",
" ",
"",
" ",
" " , '-', " ",
" ",
"",
" ",
" " , '*', " ",
" ",
"",
" ",
" " , '/', " ",
" ",
" ",
" ",
" " , '(', " ",
" ",
" ",
" ",
" " , ')', " ",
" ",
" ",
" ",
" " , '=', " ",
"",
" ",
"",
" " ;
for (int i = 0; i lt; 5; i++)

for (int j = 0; j lt; s.length(); j++)
if (s[j] != ' ')
cout lt;lt; symbols[s[j]][i] lt;lt; " ";
cout lt;lt; "\n";

int main()

string s, s1;
getline(cin, s1);
for (int i = 0; i lt; s1.length(); i++) //Удаляю пробелы
if (s1[i] != ' ')
s += s1[i];
//Проверить на баланс скобок
s += "=" + Calculation(s);
Print(s);
system("pause");
return 0;

Задать свой вопрос
Andrej Merteshev
Вы не могли бы целиком код привести?
Мишаня Гольдденштейн
Могу, но он очень длинный - 254 строки
Тимур Пошнагов
Не главно
Милана
Добавил. Функция принт просто выводит текст, до нее программа еще не доходила
Сашок Маольков
Если это весь, код, то скажите, чем компилировали? У меня на DevC++ 5.11 - не идёт
Руслан Хажинский
MS Visual Studio 2017. У меня из ошибок только предостережения о сопоставлении в циклах for знаковых типов с беззнаковыми, но в любом случае запускается. Может неувязка в том, что веб-сайт некоторые длинноватые строчки разделил на несколько? Я могу код сбросить файлом
Яна Сосорева
Все работает, спасибо за усердия
1 ответ
Попробуй
std::to_string(
Calculation())

Викулька Тювелева
я могу заблуждаться, но вроде как в C++ нет автоматического приведения инта к строке
Лугачинский Денчик
Это сработало, желая я отыскал еще странные вещи с этой строчкой, но спасибо
Степович Кира
Спрашивай)
, оставишь ответ?
Имя:*
E-Mail:


Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт