Ответ 1
1). Существуют ли другие различия между ними?
Я нахожу std::atoi()
ужасную функцию: он возвращает нуль при ошибке. Если вы считаете нуль как действительный ввод, то вы не можете определить, была ли ошибка во время преобразования или вход был равен нулю. Это просто плохо. См. Например Как узнать, не сработала ли функция c atoi или была ли она нулей?
С другой стороны, соответствующая функция С++ генерирует исключение при ошибке. Вы можете правильно отличать ошибки от нуля в качестве входных данных.
2). Эффективность и производительность, какая из них лучше?
Если вам не нужна правильность или вы точно знаете, что у вас не будет нуля в качестве входных данных, или вы все равно считаете ошибку, возможно, функции C могут быть быстрее (вероятно, из-за отсутствия исключения обработка). Это зависит от вашего компилятора, стандартной реализации библиотеки, вашего оборудования, вашего ввода и т.д. Лучший способ - измерить его. Однако я подозреваю, что разница, если таковая имеется, незначительна.
Если вам нужна быстрая (но уродливая C-стиль) реализация, наиболее ответный ответ на Как разобрать строка в int в С++? вопрос кажется разумным. Тем не менее, я бы не пошел с этой реализацией, если не был абсолютно необходим (в основном из-за необходимости связываться с завершением char*
и \0
).
3). Что безопаснее использовать?
См. первую точку.
В дополнение к этому, если вам нужно работать с char*
и следить за завершением \0
, вы больше похожи на ошибки; std::string
намного проще и безопаснее работать, поскольку он позаботится обо всех этих вещах.