

Часть 2 - Символы, Массивы символов (строки)
Текст: Bugsy
Перевод с английского: Michael B. - cs.proamd.net
Строки.
Строка определяется как группа двух или более непрерывных символов. Программно, строка - только массив чисел, которые являются их
представлением в целом виде. Каждый символ в ascii кодировке представлен целочисленным значением в диапазоне от 0 до 255. Для
пользы учебника, мы рассмотрим только буквы алфавита, хотя, у ascii есть многочисленные наборы других символов(включая числа и пунктуационные знаки). Строка с “нулевым символом”-”null character” в конце кода, должна всегда им и заканчиваться(ascii значение 0). Когда “null character” найден в пределах строки, он считается её концом. Когда вы определяете массив всегда увеличивайте размер строки на единицу, чтобы освободить пространство для “нулевого символа”. Например, если вы желаете вписать слово “слово” в вашей строке, то определите массив как new szWord [5]. Когда вы объявляете массив, каждый элемент в массиве будет иметь нулевое значение (пустой указатель) по умолчанию, таким образом мы не должны вручную устанавливать последний символ как пустой указатель (или 0). Имейте в виду, что массивы начинаются с индекса 0, и массив с размером 5, превратится в 0 - 4. [0, 1, 2, 3, 4].
Набор символов Ascii
Пожалуйста запомните, что верхний регистр и символы нижнего регистра стоит рассматривать как разные.
Значения целого числа символов Ascii:
A-Z колеблется от 65-90. 65 и 90 являются ‘Z’
a-z колеблется от 97-122. 97 и 122 являются ‘z’
Определение строк с Примером кода:
Предположим, что мы хотим определить строку и заставить её хранить слово “WORD”
Мы можем сделать это 2 способами:
1. Если вы хотите назначить значение строки своей переменной, определяя её, вы не должны учитывать размер.
Компилятор сделает это автоматически, он будет также включать дополнительный элемент для нулевого символа на конце.
1 2 | new szWord[] = "word" new szWord[] = "WORD" |
2. Ниже мы определяем массив пяти(5) элементов. Обратите внимание, как мы создаем переменную типа массив, установленную по размеру больше чем необходимо.
Ниже я установил значение szWord [4] к 0 только в целях демонстрации, хотя он необходим начиная со
значения по умолчанию (0), когда оно определено.
1 2 3 4 5 6 7 8 9 10 11 | new szWord [5] szWord [0] = 119 //w szWord [1] = 111 //o szWord [2] = 114 //r szWord [3] = 100 //d szWord [4] = 0 //"пустой указатель"-"null".. Он необходим, так как значение по умолчанию каждого элемента 0 szWord [0] = 87 //W szWord [1] = 79 //O szWord [2] = 82 //R szWord [3] = 68 //D szWord [4] = 0 //"пустой указатель"-"null" |
//Обратите внимание, что вы не должны вводить значение ascii для каждого символа. вы можете назначить символ переменной или выстроить элемент, вписывая
//его в одинарные кавычки. Пример:
szWord [0] = ‘w’
szWord [1] = ‘o’
szWord [2] = ‘r’
szWord [3] = ‘d’
szWord [4] = ‘^0′
“Нулевые Конечные Строки” - “Null Terminated Strings”.
Как упомянуто выше, когда нулевой символ (значение 0) найден в массиве, он считается концом строки.
Чтобы увидеть его в действии, вот, небольшой пример:
1 2 3 | new szWord[] = "alphabet" szWord [5] = 0 //Он будет равняться "алфав" вместо "алфавита" |
Перебор Символов в Строке.
Внизу кода будут перебираться строки, 1 символ за один раз и считать число мест в символах ‘t’s, которые найдены. вы можете сделать это двумя способами: использовать if\else или переключить оператора.
Для этой демонстрации я буду использовать штуку, которую называют “цикл”. Цикл - механизм, используемый, чтобы повторить тот же самый блок программы для переменной, n-ное число раз. В этой специфической ситуации мы знаем точное число итераций (циклов), нам надо повторить нечто, а использовать будем то, что вызывается для цикла. Синтаксис для этого цикла: (expression1; expression2; expression3).
Объяснение выражения:
expression1: Нахождение значения величины, только однажды, прежде, чем ввести цикл. Это может использоваться, чтобы объявить переменную используемой в цикле, обычно индексная переменная.
expression2: Нахождение значения величины перед каждой итерацией; цикл продолжается, пока он не станет логически неправильным. Обычно используется для условного оператора.
expression3: Нахождение значения величины после каждой итерации. Обычно используется, чтобы увеличить индексную переменную, которая была объявлена в expression1.
Примечание:: вы можете опустить все выражения, которые создадут бесконечный цикл: для (;;) [не пробуйте это, пока вы не поймете то, что делаете!]
1 2 3 | //Expression1: Объявление переменной, которая будет использоваться, для обращения к индексу массива (имеет нулевое значение по умолчанию). //Expression2: Продолжение выполнение цикла до i> 9 (цикл продолжится в то время как i<= 9) //Expression3: Увеличение переменной на 1. (каждый раз циклы кода i увеличиваются на 1) |
//С этим циклом, код начнется c i = 0, выполните код в блоке и затем возвратитесь к линии для цикла для нахождения значения выражения 2. Если это выражение истинно, то оно находит значение выражения 3 и останавливается, чтобы выполнить блок программы снова.
//оно продолжится, пока expression2 не станет отрицательным.
for (new i; i <= 9; i ++)
{
//закодируйте, чтобы повторить с каждую итерацию
}
strlen () //является функцией, которая встроена в amx-x ядро. Оно возвратит длину строки (исключая пустой указатель).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | new szString[] = "this is a test string" new iLen = strlen( szString ) new iSpaces; new iLetter_t; for ( new i = 0 ; i < iLen ; i++ ) { if ( szString[i] == ' ' ) iSpaces++ else if ( szString[i] == 't' ) iLetter_t++ //ИЛИ switch ( szString[i] ) { case ' ': iSpaces++ case 't': iLetter_t++ } } |
Результат: Места = 4: Символ ‘t’ = 4
Создадим строку, которая хранит алфавит нижнего регистра:
1 2 3 4 5 6 7 8 9 10 11 12 | new szAlphabet[27] //значения ascii 97, таким образом мы только добавляем его к нашему индексу цикла, и он будет увеличиваться с каждым проходом(new i = 0; i <26; i ++) szAlphabet [i] = i + 97 //Вот, что произойдет через цикл: //szAlphabet [0] = 97//a //szAlphabet [1] = 98//b //szAlphabet [2] = 99//c //szAlphabet [3] = 100//d //... //szAlphabet [25] = 122//z |
Массив Строк.
Вы можете создать массив строк. Это также известно как массив с 2 размерностями.
1 2 3 4 | //Определить массив строк, которым вы назначите значение: new szString[][] = { "this" , "is" , "an" , "array" , "of" , "strings" } //Если значения назначали в течение всего времени(например, для того, чтобы хранить имена игрока или steamID's) new szString [число строк] [длина самой длинной строки] |
Чтобы обратиться к строке массива, используйте аналогичный способ, такой как доступ к единственному символу в обычной строке. Пример: если бы вы хотели получить слово “массив” в вышеупомянутом массиве строк, вы использовали бы szString [3]. Чтобы получить индивидуальный символ, вы только добавляете доступ. Получается, первое ‘r’ в массиве - szString [3] [1].
Есть многочисленные функции, встраивания ядра AMX-X, которые помогают управлять строками. См. страницу с описания функций
на домашней странице AMX.
Вообще, я эти технические тексты не люблю. Пишу с глазами в два 19 дюймовых монитора, и всё подбираю слова, которые бы подошли для данной тематики.
Может даже и не подробно написано - не знаю. Автор думает на другом языке и живет на другом континенте, там возможно своё понимание подробности, отличное от нашего.
Это бот писал. Я так… оставляю иногда, когда в тему пишут, и ссылок не прячут
smiley, да куда уж подробнее?
Все замечательно, только бы подробнее.
Проглядел. Исходя из написанного там, сделал вывод: используются строки по одному байту на символ, следовательно ни о каком Unicode речи быть не может. Однако, я не исключаю возможности использования строк с Unicode другими способами.
Я в скриптинге amx мало, что понимаю
Логичнее почитать в теме http://forums.alliedmods.net/showthread.php?t=91207 ,либо в ней же спросить.
Что-то мне подсказывает, что в строках используется Unicode, как бы это уточнить?