Проверка символа на цифру c

Я новичок в C ++. Я работаю над проектом, где мне нужно читать в основном целые числа от пользователя через консоль. Чтобы не вводить нецифровые символы, я подумал о том, чтобы прочитать ввод как строку, проверить, есть ли в нем только цифры, а затем преобразовать его в целое число. Я создал функцию, так как мне нужно проверять целые числа несколько раз:

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

Решение

Есть много способов проверить строку только для числовых символов. Один

Есть такая функция:

Корректно ли такое сравнение: ‘0’ ? Судя по тому что существует функция bool isdigit( charT ch, const locale& loc ); может быть такая ситуация что char содержащий код символа 1 будет не равен ‘1’ . Или такого не может быть?

А как проверить является ли символ точкой или нет?

3 ответа 3

Эта проверка корректна, стандарты С и С++ гарантирует это (см. ответ @wololo).

Правда не понятно, зачем здесь разыменовывать i , но будем считать, что это опечатка.

может быть такая ситуация что char содержащий код символа 1 будет не равен ‘1’. Или такого не может быть?

Для C, запись ‘1’ и означает «код символа "1"», приведённый к int . С точки зрения С++ всё немного сложнее, боюсь наврать в точном определении, но, грубо говоря, это объект встроенного типа char, который при приведении к int должен дать код символа "1" (да поправят меня те, что цитируют стандарт по памяти).

А как проверить является ли символ точкой или нет?

Вариант в вопросе вполне допустим. ‘.’ == i .

Читайте также  Программа yota для windows

Стандарт языка C++ относит символы 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 к так называемому базовому множеству исходных символов (basic source character set. Это множество состоит не только из цифр. Полный список в [lex.charset] / 1), которое в свою очередь является подмножеством базового множества символов выполнения (basic execution character set). А надмножеством базового множества символов выполнения является множество символов выполнения (execution character set).

Элемент множества исходных символов (а значит и символы 0 — 9 ), заключённый в одинарные кавычки без префикса является обычным символьным литералом ([lex.ccon]):

1) any member of the source character set except the single-quote ’ , backslash , or new-line character

A character literal that does not begin with u8 , u , U , or L is an ordinary character literal. An ordinary character literal that contains a single c-char representable in the execution character set has type char , with value equal to the numerical value of the encoding of the c-char in the execution character set. An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal, or an ordinary character literal containing a single c-char not representable in the execution character set, is conditionally-supported, has type int , and has an implementation-defined value.

Из приведённой выше цитаты следует, что литералы вида ‘0’ — ‘9’ имеют тип char и значение эквивалентное числовому значению, кодирующему эти символы в множестве символов выполнения.

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

  1. Коды символов из базового множества символов выполнения (а значит и коды символов ‘0’ — ‘9’ ) неотрицательны (а с учётом того, что нулевое значение имеет нулевой символ (null character), получаем что коды символов ‘0’ — ‘9’ строго положительны), и отличаются друг от друга.
  2. В множестве символов выполнения, в списке символов 0 1 2 3 4 5 6 7 8 9 каждый символ после 0 имеет код, который на единицу больше, чем предыдущий.

The basic execution character set and the basic execution wide-character set shall each contain all the members of the basic source character set, plus control characters representing alert, backspace, and carriage return, plus a null character (respectively, null wide character), whose value is 0. For each basic execution character set, the values of the members shall be non-negative and distinct from one another. In both the source and execution basic character sets, the value of each character after 0 in the above list* of decimal digits shall be one greater than the value of the previous. The execution character set and the execution wide-character set are implementation-defined supersets of the basic execution character set and the basic execution wide-character set, respectively. The values of the members of the execution character sets and the sets of additional members are locale-specific.

*Список на который ссылается цитата выглядит так: 0 1 2 3 4 5 6 7 8 9 .

Читайте также  Скайрим нет курсора в главном меню

Таким образом, проверка переменной i типа char на хранение арабской цифры с помощью кода

using namespace std;

#include
#include
#include
#include
#include

using namespace std;

template
vector input_validation(STREAM_&, const size_t &);

int main()
<
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system("color 0A");

Ссылка на основную публикацию
Adblock
detector