небезопасно и для этого имеются лучшие альтернативы.

Смотри также

Глава 10.

3.3. Проверка, содержит ли строка допустимое число

Проблема

Имеется строка string и требуется определить, содержит ли она допустимое число.

Решение

Для проверки допустимости числа можно использовать шаблон функции lexical_cast библиотеки Boost. При таком подходе допустимое число может включать предшествующий знак минус, предшествующий знак плюс, но не пробел. В примере 3.5 приводятся несколько образцов типов форматов, с которыми работает lexical_cast.

Пример 3.5. Проверка числовой строки

#include <iostream>

#include <boost/lexical_cast.hpp>

using namespace std;

using boost::lexical_cast;

using boost::bad_lexical_cast;

template<typename T>

bool isValid(const string& num) {

 bool res = true;

 try {

  T tmp = lexical_cast<T>(num);

 } catch (bad_lexical_cast &e) {

  res = false;

 }

 return(res);

}

void test(const string& s) {

 if (isValid<int>(s))

  cout << s << ' - допустимое целое число.' << endl;

 else

  cout << s << ' - HE допустимое целое число.' << endl;

 if (isValid<double>(s))

  cout << s << ' - допустимое число двойной точности.' << endl;

 else

  cout << s << ' - HE допустимое число двойной точности.' << endl;

 if (isValid<float>(s))

  cout << s << ' - допустимое число одинарной точности.' << endl;

 else

  cout << s << ' - HE допустимое число одинарной точности ' << endl;

}

int main() {

 test('12345');

 test('1.23456');

 test('-1.23456');

 test(' - 1.23456');

 test('+1.23456');

 test(' 1.23456 ');

 test('asdf');

}

Вот вывод этого примера.

12345 - допустимое целое число.

12345 - допустимое число двойной точности.

12345 - допустимое число одинарной точности.

1.23456 - НЕ допустимое целое число.

1.23456 - допустимое число двойной точности.

1.23456 - допустимое число одинарной точности.

-1.23456 - НЕ допустимое целое число.

-1.23456 - допустимое число двойной точности.

-1.23456 - допустимое число одинарной точности.

- 1.23456 - НЕ допустимое целое число.

- 1 23466 - НЕ допустимое число двойной точности.

- 1.23456 - НЕ допустимое число одинарной точности.

+1.23456 - НЕ допустимое целое число.

+1.23456 - допустимое число двойной точности.

+1.23456 - допустимое число одинарной точности.

 1.23456 - НЕ допустимое целое число.

 1.23456 - НЕ допустимое число двойной точности.

 1.23456 - НЕ допустимое число одинарной точности.

asdf - НЕ допустимое целое число.

asdf - НЕ допустимое число двойной точности.

asdf - НЕ допустимое число одинарной точности.

Обсуждение

Шаблон функции lexical_cast преобразует значение из одного типа в другой. Он объявлен следующим образом.

template<typename Target, typename Source>

Target lexical_cast(Source arg)

Source — это тип оригинальной переменной, a Target — это тип переменной, в которую значение преобразуется. Таким образом, например, чтобы преобразовать из string в int, вызов lexical_cast имеет вид:

int i = lexical_cast<int>(str); // str - это строка

lexical_cast проводит анализ и пытается выполнить преобразование. Если преобразование невозможно, он выбрасывает исключение bad_lexical_cast. В примере 3.5 я только хочу проверить допустимость, и мне не требуется сохранять целевую переменную, так что если исключение не выбрасывается, я возвращаю true, а в противном случае — false.

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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату