Вопрос о ctype.inc
#1

Здравствуйте, я перебробовал много разных способов как проверить ник игрока на формат A-Z, a-z, 0-9 и нашёл инклуд ctype который позволяет проверить принадлежность символа.
Вот описание данного инклуда:
Код:
Для тех кто владеет языками C\C++ данный инклуд очень понравится! Он предназначен для работы с символами, и является точной копией оригинального заголовочного файла стандартной библиотеки ctype.h

Функции:

            isalnum - проверка на принодлежность символа множеству букв и цифр (A-Z, a-z, 0-9)
            isalpha - проверка на принодлежность символа множеству букв (A-Z, a-z)
            iscntrl - проверка на принодлежность символа множеству управляющих сомволов (коды ASCII 0..31 и 127)
            isdigit - проверка на принодлежность символа множеству цифр (0-9)
            isgraph - проверка на принодлежность символа множеству печетаемых символов, кроме пробела
            islower - проверка на принодлежность символа множествубукв нижнего регистра (a-z)
            isprint проверка на принодлежность символа множеству печатаемых символов
            ispunct - проверка на принодлежность символа множеству знаков пунктуации
            isspace - проверка на принодлежность символа множеству символов разделителей
            isupper - проверка на принодлежность символа множествубукв верхнего регистра (A-Z)
            isxdigit - проверка на принодлежность символа множеству шестнадцатеричных цифр

Функции принимают величину int и возвращают значение true если условие выполняется.

Примеры:
new name[24];
GetPlayerName(playerid, name, sizeof(name));
for(new i; i<sizeof(name); i++) {
    if(!isalnum(name[i])) Kick(playerid); // если символ не принадлежит множеству A-Z, a-z, 0-9
}
Тут дан маленький пример как раз таки который мне и нужен.
Я написал код, который проверяет inputtext на A-Z, a-z, 0-9 но он всегда почему то возвращает false, будь то набор из букв A-Z, будь то набор из букв a-z, будь то цифры 0-9 будь то простые символы...
Вот код:
Код:
			new playername[24];
			strmid(playername, inputtext, 0, strlen(inputtext), 255);
			for(new i; i<sizeof(playername); i++)
			{
				if(!isalnum(playername[i]))
				{
					format(string,sizeof(string),"{ffffff}Ник {ff0000}%s {ffffff}не подходит требованиям.\n\
					[ {ff0000}! {ffffff}] Имя может быть не менее 3 и не более 20 символов.\n\
					[ {ff0000}! {ffffff}] Имя должно быть формата - A-Z, a-z, 0-9. - {ff0000}Проверьте правильность этого пункта.", playername);
					ShowPlayerDialog(playerid, 3, DIALOG_STYLE_INPUT, "Имя вашего персонажа", string, "Ввод","");
					return 1;
				}
			}
Может кто то работал в данной области и подскажет как мне сделать такую проверку.
Reply
#2

Quote:
Originally Posted by Crystal_Speed
Посмотреть сообщение
Здравствуйте, я перебробовал много разных способов как проверить ник игрока на формат A-Z, a-z, 0-9 и нашёл инклуд ctype который позволяет проверить принадлежность символа.
Может кто то работал в данной области и подскажет как мне сделать такую проверку.
Простейшая функция, в чём проблемы?
Написал if'ом ибо с промежутками он быстрее
pawn Код:
stock checkstr(string[])
{
    for (new i = strlen(string)-1; i != -1; i--)
    {
        if ('z' < string[i] < 'a' && 'Z' < string[i] < 'A' && 9 < string[i] < 0)
        {
            return 0;
        }
    }
    return 1;
}
Reply
#3

Нестабильно.
С первого раза проверка - if(!checkstr(inputtext)), вписал сходу $$$ пропустило.
Со второго раза проверка - if(checkstr(inputtext)), вписал lolwhat - не пропустило.
С третьего раза опять проверка - if(!checkstr(inputtext)), вписал lolwhat не пропустило, набор тупых символов - не пропустило, набор цифр - не пропустило.
Какое значение возвращает функция если в нике нет никаких других символов кроме A-Z, a-z, 0-9?
Reply
#4

Quote:
Originally Posted by Crystal_Speed
Посмотреть сообщение
Нестабильно.
С первого раза проверка - if(!checkstr(inputtext)), вписал сходу $$$ пропустило.
Со второго раза проверка - if(checkstr(inputtext)), вписал lolwhat - не пропустило.
С третьего раза опять проверка - if(!checkstr(inputtext)), вписал lolwhat не пропустило, набор тупых символов - не пропустило, набор цифр - не пропустило.
Какое значение возвращает функция если в нике нет никаких других символов кроме A-Z, a-z, 0-9?
Вот:
pawn Код:
stock checkstr(string[])
{
    for (new i = strlen(string)-1; i != -1; i--)
    {
        if ( !('a' < string[i] < 'z' || 'A' < string[i] < 'Z' || 0 < string[i] < 9) )
        {
            return 0;
        }
    }
    return 1;
}
Если находит любой символ, кроме A-Z, a-z, 0-9, то возвращает 0.
Reply
#5

Спасибо, работает)
Reply
#6

if ( !('a' <= string[i] <= 'z' || 'A' <= string[i] <= 'Z' || 0 <= string[i] <= 9) ) правильнее вот так, т.к. символы a и z не подходят к данному условию) Только цифры почему то не проходят проверку.
Reply
#7

Буквы можно цифрами заменить или hex'ом. А цифры попробуй взять в ковычки. Или вынеси из условия и напиши: -1 < string[i] < 10
Reply
#8

Quote:
Originally Posted by Crystal_Speed
Посмотреть сообщение
if ( !('a' <= string[i] <= 'z' || 'A' <= string[i] <= 'Z' || 0 <= string[i] <= 9) ) правильнее вот так, т.к. символы a и z не подходят к данному условию) Только цифры почему то не проходят проверку.
pawn Код:
stock checkstr(string[])
{
    for (new i = strlen(string)-1; i != -1; i--)
    {
        if ( !('a' <= string[i] <= 'z' || 'A' <= string[i] <= 'Z' || '0' <= string[i] <= '9') )
        {
            return 0;
        }
    }
    return 1;
}
Reply
#9

че мой пост то удалили?
ошибка автора:
for(new i; i<sizeof(playername); i++)
для того чтобы узнать кол-во символов в массиве нужно использовать strlen, а не sizeof который просто вернет длину массива(разные вещи)
Reply
#10

Код:
stock isalnum©
{
    (c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A) return true;
    else return false;
}
вполне рабочая функция
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)