Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Krasavchik
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 30
1

Как можно использовать ASCII коды символов для проверки корректности ввода?

28.07.2015, 20:19. Просмотров 1791. Ответов 13
Метки нет (Все метки)

кто знает как можно использовать ASCII коды символов для проверки корректности ввода?
вот у меня есть программа
C
1
2
3
4
5
6
7
8
9
int main(){
 
    char name[30];
 
    printf("What is your name? ");
    scanf("%s", &name);
 
    return 0;
}
но если вместо своего имени я введу цифры или другие символы, нужно сообщить об ошибке.

я представляю это примерно так:
C
1
2
if((name[i]<=97)||(name[i]>=122))
printf("error");
но знаю, что это даже не близко к правде.
Здесь 97 и 122 я пытался ограничить ввод строчными латинскими символами.

Кто знает, помогите.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2015, 20:19
Ответы с готовыми решениями:

Что использовать для проверки корректности введенного значения - If или try catch?
Проверку на правильность введенного значения лучше делать с помощью условного оператора или блоком...

Как использовать charsToTrim с ASCII кодом? или как удалить множество символов из строки используя код ASCII
Как использовать charsToTrim с ASCII кодом? или как удалить множество символов из строки используя...

Написать программу проверки корректности ввода строки по данной маске
Использовать типы данных множество и строка для ввода информации по заданной маске: 2 буквы, 3...

Коды символов ASCII
Почему русские строковые литералы char first = 'А'; char last = 'Я'; cout &lt;&lt; (int)first...

Коды таблицы символов ASCII
Почему когда я делаю явное преобразование вводимого с клавиатуры символа в int,компилятор выдаёт...

13
CoderHuligan
773 / 554 / 203
Регистрация: 30.06.2015
Сообщений: 3,139
Записей в блоге: 27
28.07.2015, 21:55 2
Может примерно так?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main(){
 
    char name[30];
 int i;
    printf("What is your name? ");
    scanf("%s", &name);
for(i=0; i<=30; i++){
 if((name[i]<'\x61')||(name[i]>'\x7a')) printf("error");
    return 0;
        
}
}
0
Krasavchik
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 30
28.07.2015, 22:47  [ТС] 3
этот код и на буквы тоже пишет error.
и почему границами ты сделал 7 и 61?
0
ValeryS
Модератор
7745 / 5754 / 748
Регистрация: 14.02.2011
Сообщений: 19,707
Завершенные тесты: 1
28.07.2015, 23:03 4
Цитата Сообщение от Krasavchik Посмотреть сообщение
и почему границами ты сделал 7 и 61?
не 7 а 0x7A шестнадцатеричное представление 'z' оно же 122 в десятичном
https://ru.wikipedia.org/wiki/ASCII
Цитата Сообщение от Krasavchik Посмотреть сообщение
этот код и на буквы тоже пишет error.
На большие плюс не учитывается длинна строки
вот так должно сработать
C
1
2
3
4
5
6
7
   scanf("%s", &name);
for(i=0; i<sizeof(name) && name[i]!=0 ; i++)
{
 if((name[i]&0xBF)<0x41||(name[i]&0xBF)>0x5A) 
            printf("error");
     
}
Правда только на аглицкие буквы, для русских нужно учитывать кодировку, коих больше чем одна

Добавлено через 2 минуты
CoderHuligan,
у тебя проверит 1 букву и тут же сработает return 0; программа завершится
0
28.07.2015, 23:03
Krasavchik
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 30
28.07.2015, 23:29  [ТС] 5
ваш код у меня не запускается, и не могу поправить, потому что не понимаю что вы хотели сказать этим
C
1
for(i=0; i<sizeof(name) && name[i]!=0 ; i++)
а конкретно
C
1
i<sizeof(name) && name[i]!=0
а можно подробнее вот об этом?
Цитата Сообщение от ValeryS Посмотреть сообщение
Правда только на аглицкие буквы, для русских нужно учитывать кодировку, коих больше чем одна
0
ValeryS
Модератор
7745 / 5754 / 748
Регистрация: 14.02.2011
Сообщений: 19,707
Завершенные тесты: 1
29.07.2015, 00:01 6
Цитата Сообщение от Krasavchik Посмотреть сообщение
for(i=0; i<sizeof(name) && name[i]!=0 ; i++)
цикл крутится до тех пор пока счетчик меньше размера буфера ( i<sizeof(name)), здесь я ушел от конкретных цифр
если вместо char name[30]; напишешь char name[256]; не надо будет цикл переписывать,
и пока не встретился конец строки( name[i]!=0)

Цитата Сообщение от Krasavchik Посмотреть сообщение
а можно подробнее вот об этом?
можно
для начала загоняю все буквы в большой регистр, ибо маленькие и большие в английском алфавите отличаются только 6 битом
например A =0x41 a=0x61 B=0x42 b=0x62
вот я и вырезаю 6 бит при помощи операции "И"
Цитата Сообщение от ValeryS Посмотреть сообщение
name[i]&0xBF)
0xBF это 1101 1111 в двоичном представлении
а дальше смотрю диапазон попали или нет
по правильному нужно было написать так

C
1
 if((name[i]&0xBF)<'A'||(name[i]&0xBF)>'Z')
чтобы избавится от "волшебных чисел"

Добавлено через 5 минут
все наврал не 0xBF а 0xDF

1101 1111 это 0xDF
так что следует читать
C
1
if((name[i]&0xDF)<'A'||(name[i]&0xDF)>'Z')
просто параллельно другую задачу решаю, вот и вышел "затык"
0
Kerry_Jr
Эксперт PHP
2213 / 2009 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
29.07.2015, 00:12 7
Krasavchik, CoderHuligan, ValeryS, а разве функция isalpha() не подходит для этих нужд?
0
ValeryS
Модератор
7745 / 5754 / 748
Регистрация: 14.02.2011
Сообщений: 19,707
Завершенные тесты: 1
29.07.2015, 00:15 8
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
разве функция isalpha() не подходит для этих нужд?
подходит но внутре то у неё та же проверка диапазона
вот здесь кстати и примерчик есть
http://lord-n.narod.ru/download/book...14/isalpha.htm
0
CoderHuligan
773 / 554 / 203
Регистрация: 30.06.2015
Сообщений: 3,139
Записей в блоге: 27
30.07.2015, 18:56 9
Извините, заработался.
Вот код который пашет:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(void)
{
 
    char name[30]={0};
 
 int i;
    printf("What is your name? ");
    scanf("%s",name);
     
 
for(i=0; name[i]!=0; i++){
if(((name[i]<'\x61')||(name[i]>'\x7a')) && ((name[i]<'\x41')||(name[i]>'\x5a')) && ((name[i]<'\x80')||(name[i]>'\xaf'))  ) {printf("error\n"); break;}
           
}       
 return 0;
}
Кодировка 866 dos ASCII
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
а разве функция isalpha() не подходит для этих нужд?
Но, нужно ведь сначала научиться писать собственные, а уже потом можно использовать и готовые варианты. Ручками надо попробовать, ручками.
1
Krasavchik
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 30
31.07.2015, 04:14  [ТС] 10
спасибо, благодаря вашей помощи разобрался.
кстати,
Цитата Сообщение от CoderHuligan Посмотреть сообщение
if(((name[i]<'\x61')||(name[i]>'\x7a')) && ((name[i]<'\x41')||(name[i]>'\x5a')) && ((name[i]<'\x80')||(name[i]>'\xaf')) *) {printf("error\n"); break;}
здесь пишу просто числа десятичной форме, т.е. (name[i]>58).
0
ValeryS
Модератор
7745 / 5754 / 748
Регистрация: 14.02.2011
Сообщений: 19,707
Завершенные тесты: 1
31.07.2015, 07:54 11
Цитата Сообщение от Krasavchik Посмотреть сообщение
здесь пишу просто числа десятичной форме, т.е. (name[i]>58).
надеюсь это опечатка?
или ты действительно считаешь что все что выше "0" лежит, буквы есть?
0
Evg
Эксперт CАвтор FAQ
20074 / 7641 / 585
Регистрация: 30.03.2009
Сообщений: 21,397
Записей в блоге: 30
31.07.2015, 14:07 12
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

Цитата Сообщение от ValeryS Посмотреть сообщение
чтобы избавится от "волшебных чисел"
При этом внеся другое волшебное число 0xBF (или 0xDF, не важно). Проверка-то вроде бы на три копейки, но так никто нормально и не написал

C
char c = name[i];
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
{
  /* символ является латинской буквой. Всё хорошо */
} else
{
  /* ахтунг */
}
Добавлено через 1 минуту
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Но, нужно ведь сначала научиться писать собственные, а уже потом можно использовать и готовые варианты. Ручками надо попробовать, ручками
+1.
1
ValeryS
Модератор
7745 / 5754 / 748
Регистрация: 14.02.2011
Сообщений: 19,707
Завершенные тесты: 1
31.07.2015, 14:22 13
Цитата Сообщение от Evg Посмотреть сообщение
При этом внеся другое волшебное число 0xBF (или 0xDF, не важно).
ну нет в жизни совершенства
Цитата Сообщение от Evg Посмотреть сообщение
но так никто нормально и не написал
может даже это и правильно, даже скорее всего(за что лучший ответ)
но как говорил тов. Брыль("Чародеи") -"Это всем известно, и никому не интересно"
хочется ведь с преподвывертом
0
CoderHuligan
773 / 554 / 203
Регистрация: 30.06.2015
Сообщений: 3,139
Записей в блоге: 27
31.07.2015, 21:19 14
Пропустил поддержку малых русских букв. Строку 13 надо дополнить:
C
1
if(((name[i]<'\x61')||(name[i]>'\x7a')) && ((name[i]<'\x41')||(name[i]>'\x5a')) && ((name[i]<'\x80')||(name[i]>'\xaf'))    &&  ((name[i]<'\xe0')||(name[i]>'\xf1'))  ) {printf("error\n"); break;}
0
31.07.2015, 21:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 21:19

Вывести коды ASCII символов «a» и «q».
(Char). Вывести коды ASCII символов «a» и «q». Дана символьная переменная d. Присвоить логической...

Создать программу, коды символов в ASCII
Помогите сделать программу. С клавиатуры вводятся пять различных символов. Если код символа...

Подсчитать количество символов, коды ASCII которых по величине больше 75
Программирую немного на с++, с#, pascal, basic, но ассемблер никак освоить не получается. читаю...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru