Просто быстрый вопрос. Я немного осмотрел интернет и нашел несколько решений, но ни одно из них еще не сработало. Глядя на преобразование строки в int, я не имею в виду ASCII-коды.
Для быстрого перехода мы передаем уравнение в виде строки. Мы должны разбить его, правильно отформатировать и решить линейные уравнения. Теперь, говоря это, я не могу преобразовать строку в int.
Я знаю, что строка будет в формате (-5) или (25) и т. Д., Так что это определенно int. Но как нам извлечь это из строки?
Один из способов, которым я думал, это запустить цикл for / while через строку, проверить наличие цифры, извлечь все цифры после этого и затем посмотреть, есть ли начальный '-', если есть, умножить int на - 1.
Это кажется слишком сложным для такой маленькой проблемы. Любые идеи?
atoi()
?std::string
myString
, и вы хотите использоватьatoi
, то вы хотите сказатьatoi(myString.c_str())
.Ответы:
В C ++ 11 есть несколько хороших новых функций преобразования
std::string
в числовой тип.Так что вместо
ты можешь использовать
где
str
ваш номер какstd::string
.Есть версия для всех вкусов чисел:
long stol(string)
,float stof(string)
,double stod(string)
, ... см http://en.cppreference.com/w/cpp/string/basic_string/stolисточник
"11x"
в целое число11
.from_chars
C ++ 17? Предполагается, что это будет на порядок быстрее, чемstoi
.stoi
должно быть предпочтительным. См. Почему я не должен использовать atoi ()?Чтобы быть полностью правильным, вы захотите проверить флаги ошибок.
источник
-5
из(-5)
.Возможные варианты описаны ниже:
1. Первый вариант: sscanf ()
Это ошибка (также показанная cppcheck), потому что «scanf без ограничений ширины поля может привести к сбою с огромными входными данными в некоторых версиях libc» (см. Здесь и здесь ).
2. Второй вариант: std :: sto * ()
Это короткое и элегантное решение, но оно доступно только на компиляторах, совместимых с C ++ 11.
3. Третий вариант: потоки
Однако при таком решении трудно отличить плохой ввод (см. Здесь ).
4. Четвертый вариант: лексическая трансляция Boost
Тем не менее, это просто оболочка
sstream
, и документация предлагает использоватьsstream
для лучшего управления ошибками (см. Здесь ).5. Пятый вариант: strto * ()
Это решение очень длинное из-за управления ошибками, и оно описано здесь. Поскольку ни одна функция не возвращает обычное значение int, необходимо преобразование в случае целого числа (см. Здесь, как это преобразование может быть достигнуто).
6. Шестой вариант: Qt
Выводы
Подводя итог, можно сказать, что лучшим решением является C ++ 11
std::stoi()
или, в качестве второго варианта, использование библиотек Qt. Все остальные решения не приветствуются или содержат ошибки.источник
используйте функцию atoi для преобразования строки в целое число:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
источник
atoi
.strtol
делает всеatoi
, но лучше и не может безопасно.А как насчет Boost.Lexical_cast ?
Вот их пример:
источник
По общему признанию, мое решение не будет работать для отрицательных целых чисел, но оно извлечет все положительные целые числа из входного текста, содержащего целые числа. Это использует
numeric_only
язык:Введите текст:
Выходные целые числа:
Класс
numeric_only
определяется как:Полная онлайн-демонстрация: http://ideone.com/dRWSj
источник
Это, вероятно, немного излишне, но
boost::lexical_cast<int>( theString )
должно хорошо работать.источник
boost::lexical_cast<int>( theString )
(гдеtheString
имя переменной, которая содержит строку, в которую вы хотите преобразоватьint
).atoi
является встроенной функцией, которая преобразует строку в целое число, предполагая, что строка начинается с целочисленного представления.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
источник
atoi
, используйтеstrtol
вместо этого.В Windows вы можете использовать:
strtol
,stringstream
необходимо указать базу, если вам нужно интерпретировать шестнадцатеричное.источник
Ну, много ответов, много возможностей. Здесь мне не хватает универсального метода, который преобразует строку в различные целочисленные типы C ++ (short, int, long, bool, ...). Я придумал следующее решение:
Вот примеры использования:
Почему бы просто не использовать оператор вывода stringstream для преобразования строки в целочисленный тип? Вот ответ: допустим, строка содержит значение, которое превышает предел для целевого целевого типа. Например, в Wndows 64 max int равно 2147483647. Давайте присвоим строке значение max int + 1: string str = "2147483648". Теперь при преобразовании строки в int:
x становится 2147483647, что определенно является ошибкой: строка «2147483648» не должна была быть преобразована в int 2147483647. Предоставленная функция toIntegralType обнаруживает такие ошибки и выдает исключение.
источник
С http://www.cplusplus.com/reference/string/stoi/
Вывод:
2001, Космическая Одиссея: 2001 и [, Космическая Одиссея]
40с3: 16579
-10010110001: -1201
0x7f: 127
источник
Мой код:
источник
источник
Чтобы преобразовать строковое представление в целочисленное значение, мы можем использовать std :: stringstream.
если преобразованное значение выходит за пределы диапазона для целочисленного типа данных, он возвращает INT_MIN или INT_MAX.
Также, если строковое значение не может быть представлено как допустимый тип данных int, возвращается 0.
Выход: 50
Согласно приведенному выше выводу, мы можем видеть его преобразованным из строковых чисел в целое число.
Исходный код и многое другое в строке к C ++
источник
Одна линия версия:
long n = strtol(s.c_str(), NULL, base);
.(
s
Это строка, иbase
представляет собой ,int
например , как 2, 8, 10, 16.)Вы можете обратиться к этой ссылке для более подробной информации
strtol
.Основная идея заключается в использовании
strtol
функции, которая включена вcstdlib
.Так как
strtol
обрабатываются только сchar
массивом, нам нужно преобразоватьstring
вchar
массив. Вы можете обратиться к этой ссылке .Пример:
который выведет:
источник
Есть еще один простой способ: предположим, у вас есть такой персонаж,
c='4'
поэтому вы можете сделать один из следующих шагов:1-й: int q
q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .
второй способ:
q=c-'0'; the same , character '0' means 48
источник
string
к ,int
а не отchar
кstring
.