Ваша проблема, я думаю, в том, что вы делаете что-то вроде
value1 = atoi(&buffer[i]);
if (buffer[i + 1] == '+')
...
В этом фрагменте индекс i
"указывает" на то место в buffer
, где вы в данный момент выполняете анализ,Вы верите (и правильно), что i
"указывает" на первый из одного или нескольких цифровых символов. Вы звоните atoi
, чтобы преобразовать эту цифру (цифры) в фактическое целое число. Пока все хорошо. Но затем вы проверяете buffer[i + 1]
, чтобы увидеть, есть ли после числа символ оператора. Это , где возникло неправильное предположение, что числа всегда имеют длину в одну цифру. Это то, что вам нужно исправить, чтобы правильно обрабатывать многозначные числа.
Лучший способ исправить это, я бы сказал, - использовать strtol
вместо atoi
. Наиболее очевидное различие между atoi
и strtol
заключается в том, что strtol
сообщает вам, как далеко он продвинулся, сколько цифр он использовал. Он делает это, возвращая вам указатель на первый символ, который он не использовал.
Это означает, однако, что для использования strtol
вам придется явно использовать указатели. Будет намного проще, если вы будете использовать указатель
char *p;
для перехода по buffer
вместо индекса i
. Но тогда вы можете сказать что-то вроде
char *endp;
value1 = strtol(p, &endp, 10);
p = endp;
if (*p == '+')
...
. Как это работает, strtol
устанавливает endp
для указания на первый символ, который он не использовал. Вот где вы хотите продолжить анализ, поэтому вы устанавливаете p
на endp
и продолжаете.
Здесь на самом деле происходит то, что strtol
принимает указатель на указатель . Если вам пока не удобно работать с указателями, возможно, вы действительно не готовы думать об указателях на указатели, но, поверьте мне, это работает.