Как я могу проверить, представляет ли строка положительное, ненулевое int? - PullRequest
0 голосов
/ 07 января 2011

Мне не нужно знать, что такое int, мне просто нужно знать, является ли оно положительным ненулевым целочисленным представлением в десятичном представлении без начальных 0.

Он будет вызван для большого количества записей, поэтому я бы хотел, чтобы чек был как можно дешевле.

Ожидаемое поведение - система никогда не должна передавать то, что не проверяет (потому что обычно передается целое число, которое она преобразует в строки для хранения), так что это всего лишь последняя проверка безопасности, чтобы убедиться, что ничего странного не произошло.

Ответы [ 3 ]

3 голосов
/ 07 января 2011

Хотя вы могли бы на самом деле пройти процесс его преобразования в int, я предполагаю, что вы действительно хотите знать, являются ли все символы в нем цифрами?

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

Используя STL, вы можете использовать std :: find и :: isdigit и std :: not1

template<typename FwdIter>
bool all_digits( FwdIter start, FwdIter end )
{
   return std::find( start, end, std::not1(::isdigit) ) == end;
}

Конечно, вы могли бы просто написать цикл

template<typename FwdIter>
bool all_digits( FwdIter start, FwdIter end )
{
   for( ; start != end; ++start )
   {
     if( !::isdigit( *start ) )
        return false;
   }
   return true;
}

Это не будет полностью сказать вам, если входная строка представляет положительное число, поскольку все они могут быть нулями, и строка может быть пустой.Мы можем легко охватить это в версии цикла.

template<typename FwdIter>
bool is_positive_int( FwdIter start, FwdIter end )
{
   bool foundNonZero;
   for( ; start != end; ++start )
   {
     if( !::isdigit( *start ) )
        return false;
     if( *start > '0' ) // it must be a digit
        foundNonZero = true;
   }
   return foundNonZero;
}

Допущения:

  • У вас могут быть начальные нули (но там должен быть хотя бы один ненулевой), так0234 является действительным положительным числом
  • Пробелы запрещены
2 голосов
/ 07 января 2011
  • первый символ должен быть от 1 до 9
  • все остальные символы должны быть от 0 до 9

Проверьте первое, обведите все остальное, легко-peasy.

0 голосов
/ 07 января 2011

это действительно довольно просто, но это зависит от требований / разрешенного ввода:

  • какое представление / основание допускается: двоичное, восьмеричное, шестнадцатеричное? (главное отличие состоит из шестнадцатеричного числа, ваш набор цифр отличается)
  • разрешены начальные и конечные пробелы (ваш ввод - строка, вы не должны игнорировать это, если вам не обещано, что этого не произойдет)
  • разрешены ли ведущие нули?
  • ведет + разрешено?

на основании вышеизложенного может потребоваться:

  • полоса, ведущая и конечная пробел
  • сканирует строку, проверяя, что она содержит только разрешенные цифры и +
  • убедитесь, что он содержит хотя бы одну ненулевую цифру

вопрос также в том, нужно ли вам подтверждать номер, например, вход 123+456

вы можете написать простой конечный автомат, который бы делал все вышеперечисленное, если это необходимо.

EDIT

если я понимаю ваши требования, одна подсистема преобразует положительные целые числа в строки, которые в итоге попадают в другую подсистему, которая хочет проверить, что с входом ничего не произошло. если вы знаете свое преобразование между строками, задача намного проще: при условии отсутствия пробелов, нулей без начальных символов, без +, чем ваша задача действительно «легкая», как в первом ответе *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...