Другие языки программирования и технологии

Проблема с переводом из string в int

Возникла такая проблема что я ввожу в edit пример на подобии такого (2+1*2) и нужно этот пример приравнять к переменной типа int но функция strtoint() не работает
Какая ошибка выходит, кусок скрипта, и еще бы уточнить язык какой?
Lyov Shaxbazyan
Lyov Shaxbazyan
5 612
Лучший ответ
Разумеется, не работает. Функция strtoint предназначена ТОЛЬКО для преобразования строковой записи ЕДИНСТВЕННОГО ЧИСЛА, а ты вводишь АРИФМЕТИЧЕСКОЕ ВЫРАЖЕНИЕ. Так что придётся алгоритм такого преобразования писать самому. Для чего берёшь любой учебник по созданию компиляторов и читаешь раздел, посвящённый разбору арифметических выражений. Или вводишь "разбор арифметических выражений" в google.
Дмитрий Рожков
Дмитрий Рожков
87 170
Dima K короче у меня есть переменная d типа string
d равняется примеру который введен в edit т. е 2+2+3+4*2 и т. д
и чтобы переменная l типа integer равнялась ответу на пример

например d='*3+2*1'
l=5;

это от создателя вопроса
че легко да сделать это ??
че то я не могу справиться)
Mail может проглатывать части кода.

#include < iostream >
#include < map >
#include < functional >
#include < cmath >
#include < vector >
#include < algorithm >
#include < sstream >

using namespace std;

vector < float > Reader(int coutt)
{
vector < float > Enter;
cout << "Введите " << coutt << " число (а) ";
for (;;)
{
bool err = true;
int old = -1;
int limm = 5;
limm++;
string s;
cin.clear();
cin.ignore(cin.rdbuf()->in_avail(), '\n');
getline(cin, s);
for (unsigned u = 0; u < s.size(); u++)
{
if (s[u] == ',')
s[u] = '.';
}
int su = 0;
bool calc = false;
for (unsigned u = 0; u < s.size(); u++)
{
if (s[u] == ' ')
{
calc = true;
su = 0;
}
if (u == 0)
{
calc = true;
su = 1;
}
if (s[u] == '.')
{
calc = false;
}
if (calc)
su++;
if (su > limm)
{
err = false;
break;
}
}
if (!err)
{
cout << "Ошибка. Слишком длинное число. Повторите ввод ";
continue;
}
istringstream stream(s);

err = true;
for (;;)
{
float temp;

if (stream.rdbuf()->in_avail() == 0)
break;
else
{
stream.clear();
}
stream >> temp;
if (old == stream.rdbuf()->in_avail())
{
err = false;
stream.clear();
stream.ignore(stream.rdbuf()->in_avail(), '\n');
break;
}
Enter.push_back(temp);
old = stream.rdbuf()->in_avail();
}
if (err && Enter.size() == coutt)
break;
else
{
cout << "Ошибка. Символ не является числом или несоотвествие количества аргументов. Нужно " << coutt << endl << "Повторите ввод ";
Enter.clear();
}
}
return Enter;
}

void main()
{
setlocale(LC_ALL, "rus");
map < char, function < float(vector ) > > dic;
function < float(vector < float > ) > f;
vector < float > v;

auto sum = [](vector vv) { return vv[0] + vv[1]; };
auto mult = [](vector vv) { return vv[0] * vv[1]; };
auto subt = [](vector vv) { return vv[0] - vv[1]; };
auto div = [](vector vv) { return vv[0] / vv[1]; };
auto sinn = [](vector vv) { return sin(vv[0]); };

dic.insert(pair < char, function < float(vector< float >) > >('+', sum));
dic.insert(pair < char, function < float(vector< float >) > >('*', mult));
dic.insert(pair < char, function < float(vector< float >) > >('-', subt));
dic.insert(pair < char, function < float(vector< float >) > >('/', div));
dic.insert(pair < char, function < float(vector< float >) > >('s', sinn));

char op;
float a, b;
cout << "Укажите операцию ";
cin >> op;
if (op == '*' || op == '/' || op == '+' || op == '-')
{
v = Reader(2);
}
else if (op == 's')
{
v = Reader(1);
}
else
{
cout << "Операция неопознана";
}
auto calc = [op, &f](pair < char, function<float(vector < float > ) > > p)
{
if (p.first == op)
{
f = p.second;
}
};
for_each(dic.begin(), dic.end(), calc);
cout << "Результат " << f(v);
cin.get(); cin.get();
}
попробуй это (2+1*2)
даже не знаю как это организовать и для чего тебе вообще в строке.

наверно работает так.
a = 2 + 1 * 2;
string slovo = strtoint (a);
в общем лучше напиши конкретно что тебе нужно сделать.

я че то не догоняю это что где как у тебя это получается текст (2+1*2);
это текст или операция (2+1*2), если это текст то просто вывод текста,
если это операция или что там которую нужно выполнить и получить результат то ее ни как не сравнишь пока не сложишь и не умножишь ну короче пока результат не получишь, можно сравнить только как текст но не с int а string или выташить числа 2 1 2 без + и * и сравнивать с int или же получить результат 2 + 1 * 2 и сравнивать,
например
int a = (2+1*2); int a = 4;
if (a = переменная int);
или же
string a = (2+1*2);
if (string a = string b);
только так думаю ну или же только выдирать числа со строки и сравнивать а больше ни как.
Абдулазиз Жураев короче у меня есть переменная d типа string
d равняется примеру который введен в edit т. е 2+2+3+4*2 и т. д
и чтобы переменная l типа integer равнялась ответу на пример

например d='*3+2*1'
l=5;