Содержание
Я новичок в 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 .
Стандарт языка 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 и значение эквивалентное числовому значению, кодирующему эти символы в множестве символов выполнения.
Конкретные числовые значения, которыми кодируются те или иные символы в множестве символов выполнения определяются реализацией. Однако, несколько специальных гарантий всё же есть:
- Коды символов из базового множества символов выполнения (а значит и коды символов ‘0’ — ‘9’ ) неотрицательны (а с учётом того, что нулевое значение имеет нулевой символ (null character), получаем что коды символов ‘0’ — ‘9’ строго положительны), и отличаются друг от друга.
- В множестве символов выполнения, в списке символов 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");