Created
January 27, 2020 11:46
-
-
Save jin-x/d05244fe6013df154342d201cc40ba8a to your computer and use it in GitHub Desktop.
@jinxonik / UniLecs #205
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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