Skip to content

Instantly share code, notes, and snippets.

@jin-x
Created January 27, 2020 11:46
Show Gist options
  • Save jin-x/d05244fe6013df154342d201cc40ba8a to your computer and use it in GitHub Desktop.
Save jin-x/d05244fe6013df154342d201cc40ba8a to your computer and use it in GitHub Desktop.
@jinxonik / UniLecs #205
#include <iostream>
#include <string>
#include <algorithm>
#include <climits>
// Преобразование строки в число до первого неверного символа
int str_to_int(const std::string& str)
{
auto end = str.end();
// Пропускаем пробелы
auto cur = std::find_if(str.begin(), end, [](char ch) { return ch != ' ' && ch != '\t'; });
if (cur == end) { return 0; } // пустая строка (или строка из пробелов)
// Проверка знака
bool neg = false;
if (*cur == '-') { neg = true; ++cur; }
else if (*cur == '+') { ++cur; }
// Основной цикл
int n = 0; // получаемое число
unsigned char dig;
while (cur != end) { // условие можно заменить на true, т.к. последний символ всё равно '\0'
dig = *cur++ - '0'; // цифра
if (dig > 9) { break; } // проверка допустимых знаков
if (n >= INT_MAX / 10) { // проверка диапазона
// Возвращаем максимальное положительное, если число положительное и число выйдет за диапазон
// сразу после умножения на 10 либо после добавления цифры (или станет максимально допустимым)
if (!neg && (n > INT_MAX / 10 || dig >= INT_MAX % 10)) { return INT_MAX; }
// Возвращаем максимальное отрицательное, если число отрицательное и число выйдет за диапазон
// сразу после умножения на 10 либо после добавления цифры (или станет минимально допустимым)
if (neg && (n > - (INT_MIN / 10) || dig >= - (INT_MIN % 10))) { return INT_MIN; }
}
n = n * 10 + dig; // добавление цифры
}
// Возвращение значения с проверкой знака
return !neg ? n : -n;
}
// Тест функции преобразования строки в число
void test(const std::string& str)
{
std::cout << '"' << str << "\" = " << str_to_int(str) << std::endl;
}
int main()
{
test("z");
test(" ");
test("-0");
test(" \t\t 7x");
test("1");
test("-1");
test("+012345678_hi");
test("-012345678 bye!");
test("2147483646");
test("2147483647");
test("2147483648");
test("2147483649");
test("2147483650");
test("1234567890987654321");
test("-2147483647");
test("-2147483648");
test("-2147483649");
test("-2147483650");
test("-1234567890987654321");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment