У меня было немало проблем при попытке написать функцию, которая проверяет, является ли строка числом. Для игры, которую я пишу, мне просто нужно проверить, является ли строка из файла, который я читаю, числом (таким образом я буду знать, является ли это параметром). Я написал следующую функцию, которая, как мне кажется, работает без сбоев (или я случайно отредактировал ее, чтобы остановить ее, или я шизофреник, или Windows шизофреник):
bool isParam (string line)
{
if (isdigit(atoi(line.c_str())))
return true;
return false;
}
c++
visual-c++
Брендан Вайнштейн
источник
источник
if (expr) return true; return false;
! Просто напишитеreturn expr;
.if (expr) return expr; else return expr;
,if (expr == true)
,(if expr != false)
, илиif ((expr == true) == true)
. Все они вносят сложность, которая не приносит пользы писателю, читателю или компилятору кода. Устранение ненужных сложностей - это не ярлык; это ключ к написанию лучшего программного обеспечения.Ответы:
Самый эффективный способ - просто перебирать строку, пока не найдете нецифровой символ. Если есть какие-либо нецифровые символы, вы можете считать строку не числом.
Или, если вы хотите сделать это способом C ++ 11:
Как указано в комментариях ниже, это работает только для положительных целых чисел. Если вам нужно обнаружить отрицательные целые числа или дроби, вам следует выбрать более надежное решение на основе библиотеки. Хотя добавление поддержки отрицательных целых чисел довольно тривиально.
источник
!s.empty() && s.find_first_not_of("0123456789") == std::string::npos;
однострочник C ++ 03.int
. Он просто определяет, состоит ли строка из числовых цифр. Неважно, какой длины строка.<string>
<algorithm>
и<cctype>
заставить пример C ++ 11 работать.Зачем изобретать велосипед? В стандартной библиотеке C (доступной также в C ++) есть функция, которая делает именно это:
Если вы хотите работать с дробями или научным представлением, используйте
strtod
вместо этого (вы получитеdouble
результат).Если вы хотите разрешить шестнадцатеричные и восьмеричные константы в стиле C / C ++ (
"0xABC"
), сделайте0
вместо этого последний параметр .Тогда ваша функция может быть записана как
источник
atoi
как используется в вопросе).p
будет установлено,nullptr
если всеstrtol
будет успешно, верно? Это не то, что я вижу :(p
будет указывать на NUL, который завершает строку. Такp != 0
и*p == 0
.С компилятором C ++ 11 для неотрицательных целых чисел я бы использовал что-то вроде этого (обратите внимание на
::
вместоstd::
):http://ideone.com/OjVJWh
источник
Вы можете сделать это способом C ++ с помощью boost :: lexical_cast. Если вы действительно настаиваете на том, чтобы не использовать boost, вы можете просто изучить, что он делает, и сделать это. Это довольно просто.
источник
try{} catch{}
хорошую идею? Не следует ли нам избегать этого как можно больше?Я просто хотел добавить эту идею, которая использует итерацию, но какой-то другой код выполняет эту итерацию:
Он не такой надежный, как должен быть при проверке десятичной точки или знака минус, поскольку он позволяет иметь более одного каждого и в любом месте. Хорошо то, что это одна строка кода и не требует сторонней библиотеки.
Выньте "." и '-', если положительные целые числа - это все, что разрешено.
источник
std::string
, используйте егоfind_first_not_of
функцию-член.Я бы предложил подход с регулярным выражением. Полное соответствие регулярному выражению (например, с использованием boost :: regex ) с
покажет, является ли строка числом или нет. Сюда входят положительные и отрицательные числа, целые и десятичные числа.
Другие варианты:
(только позитив)
(только целое число)
(только положительное целое число)
источник
std::regex
с gcc 4.7, gcc 4.8 - они оба выдаютstd::regex_error
любой знак[
в регулярном выражении, даже для невинного "[abc]" (я делаю это неправильно?). clang-3.4 вообще не знает<regex>
. В любом случае, это кажется наиболее разумным ответом - +1.Вот еще один способ сделать это с помощью
<regex>
библиотеки:источник
С помощью этого решения вы можете проверить все, от отрицательных до положительных чисел и даже чисел с плавающей запятой. Если вы измените тип
num
на целое число, вы получите сообщение об ошибке, если строка содержит точку.Доказать: программа на C ++
источник
Я считаю, что следующий код является наиболее надежным (C ++ 11). Он ловит как целые числа, так и числа с плавающей запятой.
источник
using namespace std;
ненужная.Вот решение для проверки положительных целых чисел:
источник
Попробуй это:
источник
Брендан это
почти нормально.
предполагая, что любая строка, начинающаяся с 0, является числом, просто добавьте проверку для этого случая
ofc "123hello" вернется, как заметил Тони Ди.
источник
Самое простое, что я могу придумать на С ++
Пример рабочего кода: https://ideone.com/nRX51Y
источник
Мое решение с использованием C ++ 11 regex (
#include <regex>
), его можно использовать для более точной проверки, напримерunsigned int
, иdouble
т. Д .:Вы можете найти этот код на http://ideone.com/lyDtfi , его можно легко изменить в соответствии с требованиями.
источник
Решение, основанное на комментарии kbjorklu :
Как и в случае с ответом Дэвида Ректора, он не устойчив к строкам с несколькими точками или знаками минус, но вы можете удалить эти символы, чтобы просто проверить целые числа.
Однако я неравнодушен к решению, основанному на решении Бена Фойгта , использующем
strtod
в cstdlib для просмотра десятичных значений, научных / инженерных обозначений, шестнадцатеричных обозначений (C ++ 11) или даже INF / INFINITY / NAN (C ++ 11) является:источник
Мы можем использовать класс stringstream .
источник
Использование
<regex>
. Этот код был протестирован!источник
Еще немного посмотрев на документацию, я пришел к ответу, который поддерживает мои потребности, но, вероятно, не будет так полезен для других. Вот он (без надоедливых операторов return true и return false :-))
источник
0
, вы получите ложноотрицательный результат.Я думаю, это регулярное выражение должно обрабатывать почти все случаи
так что вы можете попробовать следующую функцию, которая может работать с обоими (Unicode и ANSI)
источник
Для проверки пар:
}
Для проверки Ints (с отрицательными)
}
Для проверки неподписанных Ints
}
источник
как это устроено: перегрузка stringstream >> может преобразовывать строки в различные арифметические типы, она делает это, последовательно считывая символы из потока строк (в данном случае ss), пока в нем не закончатся символы ИЛИ следующий символ не соответствует критериям для сохранения в тип целевой переменной.
example1:
example2:
example3:
объяснение "мусорной" переменной ":
почему бы просто не проверить, имеет ли извлечение в мой двойник допустимое значение, а затем вернуть истину, если это так?
обратите внимание, что example3 выше по-прежнему успешно считывает число 11 в переменную my_number, даже если входная строка - «11ABCD» (которая не является числом).
для обработки этого случая мы можем выполнить другое извлечение в строковую переменную (которую я назвал мусором), которая может прочитать все, что могло остаться в строковом буфере после первоначального извлечения в переменную типа double. Если что-то останется, это будет прочитано в «мусор», что означает, что переданная полная строка не была числом (она просто начинается с единицы). в этом случае мы хотели бы вернуть false;
добавленное «0» объяснение:
попытка извлечь одиночный символ в двойной потерпит неудачу (возврат 0 в наш двойной), но все равно будет перемещать позицию строкового буфера после символа. В этом случае чтение мусора будет пустым, что приведет к неправильному возврату функции true. чтобы обойти это, я добавил к строке 0, так что если, например, переданная строка была «a», она изменилась на «0a», так что 0 будет извлечен в двойное, а «a» извлечено в мусор.
добавление 0 не повлияет на значение числа, поэтому число по-прежнему будет правильно извлечено в нашу двойную переменную.
источник
чтобы проверить, является ли строка целым числом или числом с плавающей запятой, или вы можете использовать:
источник
Еще один ответ, который использует
stold
(хотя вы также можете использоватьstof
/,stod
если вам не нужна точность).источник
Как мне стало известно в ответе на мой связанный с этим вопрос, я считаю, что вам следует использовать boost :: conversion :: try_lexical_convert
источник
Попробуй это:
источник
Вы можете проверить, преобразуется ли строка в целое число, используя boost :: lexical_cast . Если выдает bad_lexical_cast исключение то строка не может быть преобразована, в противном случае - может.
См. Пример такой тестовой программы ниже:
Пример исполнения:
источник
Несколько месяцев назад я реализовал способ определять, является ли какая-либо строка целочисленной, шестнадцатеричной или двойной.
Затем в своей программе вы можете легко преобразовать число в функцию его типа, если вы выполните следующие действия:
Вы можете понять, что функция вернет 0, если число не было обнаружено. Значение 0 можно рассматривать как ложное (например, логическое).
источник
Предлагаю простое соглашение:
Если преобразование в ASCII> 0 или начинается с 0, то это число. Это не идеально, но быстро.
Что-то вроде этого:
источник
Эта функция заботится обо всех возможных случаях:
источник
Не могли бы вы просто использовать код возврата sscanf, чтобы определить, является ли он int?
источник