Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/56: Рейтинг темы: голосов - 56, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 10.09.2014
Сообщений: 10

Проверка ввода символов

13.04.2015, 21:43. Показов 11909. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Преподаватель сказала сделать проверку ввода, чтобы вводить можно было только буквы(кириллицу).
В тетрадке она мне написала, каким способом двигаться:
unsigned char c;
c = (unsigned char)S[i];
if (isdigit(c)) ...

Я так понял, что во второй строке она хочет преобразовать строку в массив символов, но у меня не получается.
Помогите, пожалуйста!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.04.2015, 21:43
Ответы с готовыми решениями:

Visual C++ проверка ввода на число, проверка на кирилицу
Суть ввести с клавиатуры нечто, и повторять ввод до тех пор пока введенное число не будет числом. Этот код проверяет на буквы и знаки,...

Ошибка ввода символов строки, при количестве символов кратных 8
Здравствуйте, уважаемые форумчане! Разбираясь с механизмом ввода и динамическим выделением памяти для строк решил написать такой...

Вводится последовательность символов. Признак конца ввода – точка. Посчитать количество символов не являющихся пробелами
Порядок выполнения работы 1.Изучите теоретическое обоснование и проанализируйте приведенные выше примеры программ с циклами типа for,...

23
20 / 20 / 14
Регистрация: 07.02.2015
Сообщений: 145
13.04.2015, 21:55
C++
1
2
3
4
5
unsigned char input;
while (!cin>>input){
  cin.clear();
  cin.sync();
}
Ввод будет продолжаться до тех пор, пока не будет введено подходящее под unsigned char значение. И, кстати, тип переменной input можно изменить на любой другой.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 06:41
Цитата Сообщение от DISTURB Посмотреть сообщение
Ввод будет продолжаться до тех пор, пока не будет введено подходящее под unsigned char значение.
А какое, для unsigned char, будет не подходящее? И буквы, и цифры, всё подойдет. А у ТС задание:
Цитата Сообщение от Зеленый арбуз Посмотреть сообщение
чтобы вводить можно было только буквы
Да ещё и не просто буквы, а только:
Цитата Сообщение от Зеленый арбуз Посмотреть сообщение
(кириллицу)
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 07:11
Цитата Сообщение от Зеленый арбуз Посмотреть сообщение
В тетрадке она мне написала, каким способом двигаться:
unsigned char? Меняйте преподавательницу. Вам нужно проверить что введенный символ C удовлетворяет условию C>='а'&&C<='я' || C>='А'&&C<='Я'.
Ну а дальше уж как вам удобнее - можете читать посимвольно, можете прочитать всю строчку и потом уже проверить.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 07:31
Цитата Сообщение от Renji Посмотреть сообщение
unsigned char? Меняйте преподавательницу.
Не нужно менять. Если кирилица, и char знаковый, то функции ссtype не будут нормально работать. Дальше же, было предложено:
Цитата Сообщение от Зеленый арбуз Посмотреть сообщение
if (isdigit(c)) ...
Так что, всё логично.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 07:37
Цитата Сообщение от lss Посмотреть сообщение
Не нужно менять. Если кирилица, и char знаковый, то функции ссtype не будут нормально работать. Дальше же, было предложено:
Дальше предложено использовать isdigit, который проверяет является ли символ числом. Что не имеет абсолютно никакого отношения к кириллице. Так что я еще раз советую менять преподавательницу.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 07:43
Цитата Сообщение от Renji Посмотреть сообщение
Дальше предложено использовать isdigit, который проверяет является ли символ числом. Что не имеет абсолютно никакого отношения к кириллице. Так что я еще раз советую менять преподавательницу.
А зачем проверяет? Затем, что не всё в строке может быть цифрой. Если S[i] - буква кирилицы, a char знаковый, то isdigit() выдаст ошибку, мол не понимаю, что это за символ. Так что, не нужно менять, тем более, в первом посте, ты возмущался не isdigit(), а:
Цитата Сообщение от Renji Посмотреть сообщение
unsigned char?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 07:51
Цитата Сообщение от lss Посмотреть сообщение
А зачем проверяет? Затем, что не всё в строке может быть цифрой. Если S[i] - буква кирилицы, a char знаковый, то isdigit() выдаст ошибку, мол не понимаю, что это за символ. Так что, не нужно менять.
Во-первых, не выдаст он никакой ошибки, за банальным отсутствием хоть какой-то выдавалки (флага ошибок/поддержки механизма исключений).
Во-вторых, вы в старт-посте хоть одно слово про цифры видите? ТЗ было разрешить вводить только символы кириллицы.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 08:05
Цитата Сообщение от Renji Посмотреть сообщение
Во-первых, не выдаст он никакой ошибки, за банальным отсутствием хоть какой-то выдавалки (флага ошибок/поддержки механизма исключений).
Выдаст или не выдаст, но нормально не обработает, потому, что:
Цитата Сообщение от lss Посмотреть сообщение
мол не понимаю, что это за символ.
Цитата Сообщение от Renji Посмотреть сообщение
Во-вторых, вы в старт-посте хоть одно слово про цифры видите?
А зачем мне там цифры видеть? Я вижу твоё возмущение по поводу:
Цитата Сообщение от Renji Посмотреть сообщение
unsigned char? Меняйте преподавательницу.
Так как там дальше, в коде, идёт isdigit(), то возмущаться нечем.
Я согласен с тобой, что путь предложен нерациональный, но unsigned char здесь ни при чём.
Миниатюры
Проверка ввода символов  
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 08:23
Цитата Сообщение от lss Посмотреть сообщение
Выдаст или не выдаст, но нормально не обработает, потому, что:
А, понял, костыль для студии. Заголовок функции - int isdigit ( int c ); И если в Студии она не хочет переваривать знаковое целое, значит, Студию тоже менять.
Цитата Сообщение от lss Посмотреть сообщение
А зачем мне там цифры видеть? Я вижу твоё возмущение по поводу:
Возмущение просто - для проверки символа на вхождение в диапазон (неважно какой), преобразование к без знаковому числу не нужно. А isdigit это в порядке дополнительного указания на бредовость методички.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
14.04.2015, 08:35
Renji, и что вам там не понравилось? unsigned здесь нужна для использования расширенного набора ASCII, приведение к типу - для избежания предупреждения компилятора..
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 09:02
Цитата Сообщение от Renji Посмотреть сообщение
А, понял, костыль для студии. Заголовок функции - int isdigit ( int c ); И если в Студии она не хочет переваривать знаковое целое, значит, Студию тоже менять.
Неа, студия - это наше всё... Тут дело не в знаковом целом. Знаковое целое, оно и в Африке - знаковое целое, а вот должен ли быть char знаковым или беззнаковым - это, насколько знаю, стандартом не определено, отдано на откуп разработчикам.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Возмущение просто - для проверки символа на вхождение в диапазон (неважно какой), преобразование к без знаковому числу не нужно.
А с этим никто и не спорит, но в коде, из первого поста, и нет такой проверки, так что всё, с точки зрения формальной логики, там логично.

Добавлено через 9 минут
Может быть, со знаковым char, что-то подобное происходит? Распространенные ошибки
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 10:10
Цитата Сообщение от KOPOJI Посмотреть сообщение
Renji, и что вам там не понравилось? unsigned здесь нужна для использования расширенного набора ASCII, приведение к типу - для избежания предупреждения компилятора..
То что это "нужна" не соответствует стандарту. Смотрим в документацию - нет требования unsigned. Пишем в g++ isdigit(-10) - компилятор переваривает все на ура.
Цитата Сообщение от lss Посмотреть сообщение
Неа, студия - это наше всё... Тут дело не в знаковом целом. Знаковое целое, оно и в Африке - знаковое целое, а вот должен ли быть char знаковым или беззнаковым - это, насколько знаю, стандартом не определено, отдано на откуп разработчикам.
Тут дело в том, что isdigit принимает int, а не char. То есть, заголовок функции явно указывает на работу в том числе и с отрицательными числами. А потом приходит Студия и говорит "не, ребята. Символы с отрицательными кодами сюды пихать нельзя".
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
14.04.2015, 10:22
Цитата Сообщение от Renji Посмотреть сообщение
То что это "нужна" не соответствует стандарту
причем тут isdigit вообще? Я говорю про сам набор символов кодировки: signed char = -127..127 -> ASCII (0..127); unsigned char = 0..255 -> ASCII extended (0..255). В обычный набор кириллица не входит, в расширенный - входит.
Смотрите кодировку ASCII, а не документацию по всяким функциям.. Например, cp866 http://www.ascii-codes.com/cp866.html
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 10:56
Цитата Сообщение от Renji Посмотреть сообщение
А потом приходит Студия и говорит "не, ребята. Символы с отрицательными кодами сюды пихать нельзя".
И где, студия, это говорит? По скрину, в 9-м посте, не скажешь, что она это говорит.

Добавлено через 21 минуту
Что пишут в википедии, по поводу этих функций: https://ru.wikipedia.org/wiki/Ctype.h

Реализация функций

В большинстве библиотек языка C подпрограммы классификации используют статические таблицы поиска вместо макросов или функций. Например, создается массив из 256 восьмибитовых целых чисел, где каждый бит означает определенное свойство символа (является цифрой, буквой и т. д.). Если бит 1 показывает, цифра данный символ или нет, то код мог бы быть записан так:
#define isdigit(x) (TABLE[x] & 1)

Ранние версии Linux использовали потенциально опасный код, подобный следующему:
#define isdigit(x) ((x) >= '0' && (x) <= '9')

Это могло вызвать проблемы, если в качестве аргумента использовался, например, вызов функции. В таком случае сразу не было видно, что функция вызывается дважды.
Неправильное использование[править | править вики-текст]
Во всех случаях аргумент имеет тип int, причем его значение должно принадлежать диапазону значений типа unsigned char, или же быть равным значению макроконстанты EOF. Если аргумент имеет любое другое значение, поведение функций не определено.

Тип char в зависимости от реализации может быть как знаковым, так и беззнаковым. Если тип char является знаковым, то неявное преобразование в int может привести к появлению отрицательных чисел, что вызовет неопределенное поведение функции. Чаще всего происходит выход за пределы таблицы поиска и аварийное завершение программы.
//Этот код может работать некорректно.
char test = 'b';

toupper( 'a' );
int res = ispunct( test );

Чтобы избежать этого, используя char-аргументы, сперва явно преобразуйте их в int.

int-значения, возвращаемые функциями getchar, getc, fgetc обязательно принадлежат диапазону значений типа unsigned char (или равны EOF), поэтому здесь преобразование не требуется.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 10:57
Цитата Сообщение от lss Посмотреть сообщение
И где, студия, это говорит? По скрину, в 9-м посте, не скажешь, что она это говорит.
А чей там assert показан? Вроде же Студия со своим компилятором идет, а не с внешним. Значит и ассерт тоже студийный.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 11:11
Цитата Сообщение от Renji Посмотреть сообщение
А чей там assert показан?
Я не вижу, что там assert по поводу отрицательного числа. Я вижу, что число оказалось больше 256.
Вот ещё цитаты на эту тему:
Далее мы будем пользоваться функциями из <ctype.h>.

Существует одна тонкость, касающаяся преобразования символов в целые числа: язык не определяет, являются ли переменные типа char знаковыми или беззнаковыми. Может ли при преобразовании char в int когда-нибудь получиться отрицательное число? На машинах с разной архитектурой ответы могут отличаться. На некоторых машинах значение типа char у которого старший бит равен единице будет преобразовано в отрицательное число (так называемое «распространение знакового разряда»). На других — преобразование char в int осуществляется путем добавления нулей слева, и, таким образом, получаемое значение всегда положительно.

Гарантируется, что любой символ из стандартного набора печатаемых символов никогда не будет отрицательным числом, поэтому в выражениях такие символы всегда являются положительными операндами. Но произвольный восьмибитовый код в переменной типа char на одних машинах может быть отрицательным числом, а на других — положительным. Для совместимости переменные типа char, в которых хранятся данные не являющиеся символами, следует явно определять как signed или unsigned.
В языке C++ для хранения однобайтового символа используется тип данных char. Переменную типа char можно рассматривать двояко: как целое число, занимающее 1 байт и способное принимать значения от -128 до 127 (тип signed char, есть также беззнаковая модификация unsigned char, принимающая значения от 0 до 255) и как один символ текста. Само по себе определение char может оказаться как знаковым, так и беззнаковым, в зависимости от операционной системы и компилятора. Поэтому использовать тип char не рекомендуется, лучше явно указывать будет ли он знаковым (signed) или беззнаковым (unsigned).
И т.д., и т.п....
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 11:50
Цитата Сообщение от lss Посмотреть сообщение
Я не вижу, что там assert по поводу отрицательного числа. Я вижу, что число оказалось больше 256.
assert по поводу (unsigned)(c+1)<=256. Что и сработает на любом отрицательном числе кроме минус единицы (ввиду особенностей преобразования отрицательного к беззнаковому).
Цитата Сообщение от lss Посмотреть сообщение
Вот ещё цитаты на эту тему:
Я бы предпочел выдержку из стандарта. Потому как вся аргументация ваших цитат сводится к тому, что преобразование char в int платформозависимо. Ну так это порождает не неопределенное поведение, а максимум, поведение, определяемое реализацией. Что совсем другая песня.

Но ок, признаю, у части компиляторов проблема с отрицательными символами есть. Хотя, мне ее в g++ воспроизвести так и не удалось.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.04.2015, 12:11
Цитата Сообщение от Renji Посмотреть сообщение
Я бы предпочел выдержку из стандарта.
Какие выдержки, если стандарт не определяет каким должен быть char: знаковым или беззнаковым, а от этого и проблемы возникают.
Цитата Сообщение от Renji Посмотреть сообщение
Но ок, признаю, у части компиляторов проблема с отрицательными символами есть.
В том то и дело, что никаких отрицательных символов нет (нет отрицательных кодов символов).
Цитата Сообщение от Renji Посмотреть сообщение
Потому как вся аргументация ваших цитат сводится к тому, что преобразование char в int платформозависимо.
Это не мои цитаты, и не моя аргументация. Что собственно аргументировать? Что char бывает знаковым и беззнаковым? И разные компиляторы по разному это обрабатывают? Я цитаты привёл к тому, что здесь не всё так просто, как кажется, и что стоит обратить на это внимание, и подумать над приведёнными рекомендациями.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.04.2015, 12:21
Цитата Сообщение от lss Посмотреть сообщение
Какие выдержки, если стандарт не определяет каким должен быть char: знаковым или беззнаковым, а от этого и проблемы возникают.
Выдержки о том, что конструкция isdigit('ф') работать не должна. Знаковый char или не знаковый, не важно. Важно что если стандарт не запретил isdigit('ф'), а Студия запретила, значит Студия нарушила стандарт.
Цитата Сообщение от lss Посмотреть сообщение
В том то и дело, что никаких отрицательных символов нет (нет отрицательных кодов символов).
Тогда компилятор рассматривающий 'ф' как отрицательное число опять же нарушил стандарт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.04.2015, 12:21
Помогаю со студенческими работами здесь

Проверка ввода символов
Как мне проверить ввод символов в textBox? меня устраивают только цифры и буквы от A-F, если введён недопустимый символ, то в другом текст...

Проверка ввода символов
Всем доброго утра. Хочу спросить: кто знает, как запретить вставку текста из буфера в поле Edit (в тоже время цифры должны вставлятся)?

Проверка ввода символов в StringGrid
Есть такая проблема, нужно при вводе в StringGrid отслеживать вводимые символы. Нужно это для того, что бы пользователь не смог туда ввести...

Проверка ввода определенных символов
Всех приветствую, подскажите как сделать проверку ввода определенных чисел/букв(Например ввожу я двоичный код &quot;0&quot; и &quot;1&quot;...

Проверка ввода определенного количества символов
Можно ли ее осуществить с помощью какого-нибудь валидатора? Например мне в textbox нужно вводить от 5 до 15 символов, иначе возникает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru