Stoi в c какая библиотека
Перейти к содержимому

Stoi в c какая библиотека

  • автор:

std:: stoi, std:: stol, std:: stoll

Interprets a signed integer value in the string str .

Let ptr be an internal (to the conversion functions) pointer of type char * (1,3,5) or wchar_t * (2,4,6) , accordingly.

1) Calls std:: strtol ( str. c_str ( ) , & ptr, base ) .
2) Calls std:: wcstol ( str. c_str ( ) , & ptr, base ) .
3) Calls std:: strtol ( str. c_str ( ) , & ptr, base ) .
4) Calls std:: wcstol ( str. c_str ( ) , & ptr, base ) .
5) Calls std:: strtoll ( str. c_str ( ) , & ptr, base ) .
6) Calls std:: wcstoll ( str. c_str ( ) , & ptr, base ) .

Discards any whitespace characters (as identified by calling std::isspace) until the first non-whitespace character is found, then takes as many characters as possible to form a valid base-n (where n= base ) integer number representation and converts them to an integer value. The valid integer value consists of the following parts:

  • (optional) plus or minus sign
  • (optional) prefix ( 0 ) indicating octal base (applies only when the base is 8 or ​ 0 ​ )
  • (optional) prefix ( 0x or 0X ) indicating hexadecimal base (applies only when the base is 16 or ​ 0 ​ )
  • a sequence of digits

The set of valid values for base is . The set of valid digits for base- 2 integers is , for base- 3 integers is , and so on. For bases larger than 10 , valid digits include alphabetic characters, starting from Aa for base- 11 integer, to Zz for base- 36 integer. The case of the characters is ignored.

Additional numeric formats may be accepted by the currently installed C locale.

If the value of base is ​ 0 ​ , the numeric base is auto-detected: if the prefix is 0 , the base is octal, if the prefix is 0x or 0X , the base is hexadecimal, otherwise the base is decimal.

If the minus sign was part of the input sequence, the numeric value calculated from the sequence of digits is negated as if by unary minus in the result type.

If pos is not a null pointer, then ptr will receive an address of the first unconverted character in str. c_str ( ) , and the index of that character will be calculated and stored in * pos , giving the number of characters that were processed by the conversion.

Contents

[edit] Parameters

str the string to convert
pos address of an integer to store the number of characters processed
base the number base

[edit] Return value

Integer value corresponding to the content of str .

[edit] Exceptions

  • std::invalid_argument if no conversion could be performed.
  • std::out_of_range if the converted value would fall out of the range of the result type or if the underlying function ( std::strtol or std::strtoll ) sets errno to ERANGE .

[edit] Example

Run this code

#include #include #include #include #include int main() { const auto data = { "45", "+45", " -45", "3.14159", "31337 with words", "words and 2", "12345678901", }; for (const std::string s : data) { std::size_t pos{}; try { std::cout  "std::stoi("  std::quoted(s)  "): "; const int i{std::stoi(s, &pos)}; std::cout  i  "; pos: "  pos  '\n'; } catch (std::invalid_argument const& ex) { std::cout  "std::invalid_argument::what(): "  ex.what()  '\n'; } catch (std::out_of_range const& ex) { std::cout  "std::out_of_range::what(): "  ex.what()  '\n'; const long long ll{std::stoll(s, &pos)}; std::cout  "std::stoll("  std::quoted(s)  "): "  ll  "; pos: "  pos  '\n'; } } std::cout  "\nCalling with different radixes:\n"; for (const auto& [s, base] : {std::pairconst char*, int> {"11", 2}, {"22", 3}, {"33", 4}, {"77", 8}, {"99", 10}, {"FF", 16}, {"jJ", 20}, {"Zz", 36}}) { const int i{std::stoi(s, nullptr, base)}; std::cout  "std::stoi("  std::quoted(s)  ", nullptr, "  base  "): "  i  '\n'; } }
std::stoi("45"): 45; pos: 2 std::stoi("+45"): 45; pos: 3 std::stoi(" -45"): -45; pos: 4 std::stoi("3.14159"): 3; pos: 1 std::stoi("31337 with words"): 31337; pos: 5 std::stoi("words and 2"): std::invalid_argument::what(): stoi std::stoi("12345678901"): std::out_of_range::what(): stoi std::stoll("12345678901"): 12345678901; pos: 11 Calling with different radixes: std::stoi("11", nullptr, 2): 3 std::stoi("22", nullptr, 3): 8 std::stoi("33", nullptr, 4): 15 std::stoi("77", nullptr, 8): 63 std::stoi("99", nullptr, 10): 99 std::stoi("FF", nullptr, 16): 255 std::stoi("jJ", nullptr, 20): 399 std::stoi("Zz", nullptr, 36): 1295

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 2009 C++11 std::out_of_range would not be thrown if
std::strtol or std::strtoll sets errno to ERANGE
will throw

Реализация преобразования string to int на C/C++

Доброго времени суток! Такие функции, как stoi, atoi, atol, soul, stof, to_string и некоторые другие появились в стандарте C++11 и уже стали привычными. Особенно для пользователей Visual Studio версии 13 года и старше. Но бывают исключительные случаи, когда под рукой нет такого крутого инструмента, а только блокнот и старенький gcc. Либо инструмент есть, но он упорно отказывается работать с C++11.

Именно с такой проблемой я недавно столкнулся. Мне позарез нужно было конвертировать строку в целое число, а мой Eclipse даже через 2 часа шаманствования с бубном так и не стал дружить с функцией stoi. Было принято волевое решение написать свою реализацию преобразования string to int. Я остановился на реализации преобразования целых десятичных положительных и отрицательных чисел, этого вполне хватило.

Функция преобразования string to int на C/C++

Преобразование контейнера string в целое число int задача не самая сложная, особенно учитывая, что я работал только с десятичной системой счисления. Алгоритм простой, бежим по строке, если находим не цифру, ругаемся и возвращаем ноль, остальные цифры умножаем на десятку в нужном порядке и прибавляем к результату. Кроме того, смотрим на первый символ, если там стоит минус, не забываем это учесть.

int my_stoi(string str) < int num = 0; int ten; bool signFlag = true; //true: +, false: - for(unsigned int i = 0; i < str.length(); i++) < if(str[i] < '0' || str[i] >'9') < if(i == 0 && str[i] == '-') < signFlag = false; continue; >if(i == 0 && str[i] == '+') < signFlag = true; continue; >return NULL; > ten = 1; for(unsigned int j = 0; j < str.length() - 1 - i; j++) < ten *= 10; >num += ten * (str[i] - '0'); > if(signFlag) < return num; >else < return -num; >>

Функция преобразования char* to int на C/C++

Преобразование сишной строки в число отличается только тем, что нам самим придется посчитать длину этой строки. Вот вам, кстати, заодно и реализация strlen.

int my_stoi(char* str) < unsigned int strLen = 0; unsigned int i = 0; while(str[i] != '\0') < strLen += 1; i++; >int num = 0; int ten; bool signFlag = true; //true: +, false: - for(i = 0; i < strLen; i++) < if(str[i] < '0' || str[i] >'9') < if(i == 0 && str[i] == '-') < signFlag = false; continue; >if(i == 0 && str[i] == '+') < signFlag = true; continue; >return NULL; > ten = 1; for(unsigned int j = 0; j < strLen - 1 - i; j++) < ten *= 10; >num += ten * (str[i] - '0'); > if(signFlag) < return num; >else < return -num; >>

Заключение

А суть статьи в том, чтобы я в следующий раз не тратил 20 минут на написание stoi, а пришел сюда и скопировал код. Кроме того, возможно кому нибудь пригодится эта реализация для учебных целей, всякое может быть.

Чем заменить функцию stoi?

В программе нужно перевести строку в целое число. Я пытался использовать функцию stoi для этой цели, но она не принимается — выходит ошибка:

'stoi' was not declared in this scope 

В частности, мне нужно перевести строку наподобие такой «5678906576» в целое число. Я пытался заменить ее на atoi , используя предварительно c_str . Пишу:

string str = "5678906576"; cout  

Получаю в консоли 1383939280 . Тогда я пробую функцию fromStdString().toInt() из Qt Core. Пишу:

string str = "5678906576"; cout  

Получаю 0. Господа, объясните, пожалуйста, почему так и чем мне тогда заменить stoi . Использую Qt 4.7.4 QtCreator-2.4.1.

Stoi в c какая библиотека

Преобразование строки в целое: stoi( )

Сначала опишем, каким должен быть вход и выход у этой функции. Вход будет символьной строкой, поэтому stoi( ) будет иметь символьную строку в качестве аргумента. На выходе должно быть получено два значения: состояние и преобразованное целое число. Мы применяем return для состояния и поэтому должны использовать указатель для возврата другого значения. Таким образом, появится второй аргумент - указатель на целое число. Скелет нашей функции будет выглядеть примерно так:

stoi(string, intptr)

char string[ ]; /* вводимая строка * /

int *intptr; /* указатель на переменную, получающую целое значение*/

return(status);

Прекрасно, а что можно сказать об алгоритме выполнения преобразования? На некоторое время проигнорируем знак и предположим, что строка содержит только цифры. Возьмем первый символ и преобразуем его в числовой эквивалент. Предположим, это символ '4'. Он имеет в коде ASCII числовое значение 52 и в таком виде запоминается. Если мы из него вычтем 48, то получим 4, т. е.

Но 48 - это ASCII-код символа '0', поэтому

Действительно, этот последний оператор был бы справедлив в любом коде, в котором используются последовательные числа для представления последовательных цифр. Поэтому если num- числовое значение, a chn- символ цифры, то

num = chn - '0';

Итак, мы используем этот метод для преобразования первой цифры в число. Теперь возьмем следующий элемент массива. Если он '', то у нас была только одна цифра, и мы закончили работу. Предположим, однако, что этот элемент '3'. Превратим его в числовое значение 3. Но если оно равно 3, то 4 должно было быть числом 40, а оба числа вместе 43:

num = 10 * num + chn - '0';

Теперь просто продолжим этот процесс, умножая старое значение num на 10 каждый раз, когда мы находим следующую цифру. Наша функция будет использовать этот метод.

Вот определение функции stoi( ). Мы храним ее в том же файле, что и getint( ), так что она может использовать те же самые директивы #define.

/* превращает строку в целое число и сообщает о состоянии */

stoi(string, intptr)

char string[ ]; /* строка, подлежащая преобразованию в целое*/

int *intptr; /* значение целого */

int sign = 1; /* проверяет наличие знака + или - */

int index = 0;

if(string[index] == '-' || string[index] == '+')

sign = (string[index ++] == '-') ? -1 : 1; /* установить знак */

*intptr = 0; /* начальное значение */

while(string[index] >= '0' && string[index]

*intptr = 10 * (*intptr) + strmg[index++] - '0';

if(string[index] == '')

*intptr = sign * (*intptr);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *