Есть ли в C аналог strtok не меняющий исходную строку?

программирование C++ С++

Я пишу калькулятор и у меня возникли две проблемы

Первая:
strtok портит строку, что в общем-то логично, но я пробовал после первого вызова вернуть строку в начальное состояние и strtok все равно работал как обычно, тогда возникает вопрос, зачем он портит строку?

Вторая:
Вот этот код работает:
x = atof(strtok(auxArr, " ^*/+-"));
y = atof(strtok(NULL, " ^*/+-"));
pow(x, y);

А этот нет:
pow(atof(strtok(auxArr, " ^*/+-")),
atof(strtok(NULL, " ^*/+-")));

Мне конечно не сложно написать с лишними переменными, но интересно узнать глубинный смысл происходящего, в чём разница?

PS: пишу в Visual studio 2010
Ответы:
По идее "оптимизирует" для повторных парсингов (создает заново с пропарсенных данных)
Проблема не в самом strtok, а в том, что порядок вычисления параметров функции НЕ ОПРЕДЕЛЕН. Поэтому нельзя при вычислении параметров функции производить побочные эффекты, имеющие значение для вычисления других аргументов - а ты это делаешь, так как strtok модифицирует обрабатываемую строку.
Вообще если тебе нужен калькулятор, просто возьми калькулятор на спирите.
Для распарсивания строки при написании калькулятора удобнее пользоваться
double strtod(char *str,char **end);
Она сразу возвращает тебе double первого найденного числа,а адрес разделителя(или правильнее остатка строки) записывает в end.Из end извлекаешь знак операции(или скобки,или пробел).Далее опять вызываешь
strtod(end+1,end);


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.