JuniorКодЧастоЕщё не отвечали
Реализуйте функцию int atoi(const char* str)
Реализуйте myAtoi: преобразование C-строки в int, повторяя поведение стандартной atoi.
Требования:
- Пропустить ведущие пробелы, затем обработать опциональный знак
+/-. - Накапливать цифры до первого нецифрового символа, на котором остановиться.
- При переполнении ограничить результат до
INT_MIN/INT_MAX. - Вернуть 0 для null или пустого ввода.
- Не использовать
std::stoi,strtolилиstd::from_chars.
int myAtoi(const char* s) {
// ваш код здесь
}
Допишите реализацию.
Пропустить пробелы, обработать знак, накапливать цифры: result = result * 10 + digit. Учесть переполнение (clamp до INT_MIN/INT_MAX) и остановиться на первом нецифровом символе.
- ✗Не пропускать ведущие пробелы (стандартный
atoiих игнорирует) - ✗Переполнение целого при накоплении — проверяйте до умножения
- ✗Некорректно обрабатывать знак минус: '-' перед цифрами устанавливает флаг
- →В чём разница между
atoi,strtol,std::stoiиstd::from_chars? - →Чем
std::from_charsотличается отstd::stoiв плане обработки ошибок?
Оглавление
Задача
Реализуйте функцию int myAtoi(const char* str), аналогичную стандартной atoi, включая обработку пробелов, знака и переполнения.
Решение
#include <climits>
#include <cctype>
#include <cassert>
int myAtoi(const char* s) {
if (!s) return 0;
// 1. Пропускаем ведущие пробелы
while (*s == ' ') ++s;
// 2. Обрабатываем знак
int sign = 1;
if (*s == '-' || *s == '+') {
if (*s == '-') sign = -1;
++s;
}
// 3. Накапливаем цифры с контролем переполнения
long long result = 0;
while (std::isdigit(*s)) {
result = result * 10 + (*s - '0');
if (result * sign > INT_MAX) return INT_MAX;
if (result * sign < INT_MIN) return INT_MIN;
++s;
}
return static_cast<int>(result * sign);
}
int main() {
assert(myAtoi("42") == 42);
assert(myAtoi(" -42") == -42);
assert(myAtoi("4193words") == 4193);
assert(myAtoi("") == 0);
assert(myAtoi("2147483648") == INT_MAX); // переполнение
assert(myAtoi("-91283472332") == INT_MIN);
}
Ключевые моменты
- Использование
long longдля промежуточного результата позволяет обнаружить переполнение перед усечением. - Остановка на первом нецифровом символе — стандартное поведение
atoi. - Для производственного кода используйте
std::from_chars(C++17): без выделения памяти, с явным сообщением об ошибке.
Оглавление