Написал admin 07 30, 2009


Часть 2 - Символы, Массивы символов

Часть 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 &lt;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.

Похожие темы:

Оставить комментарий


7 комментариев »

Оставить комментарий

:mrgreen: :| :twisted: 8O :) :? 8) :evil: :D :idea: :P :roll: ;-) :cry: :o :x :( :arrow: :!: :?:


  1. admin Says:

    Вообще, я эти технические тексты не люблю. Пишу с глазами в два 19 дюймовых монитора, и всё подбираю слова, которые бы подошли для данной тематики.
    Может даже и не подробно написано - не знаю. Автор думает на другом языке и живет на другом континенте, там возможно своё понимание подробности, отличное от нашего.

    comment-bottom
  2. admin Says:

    Это бот писал. Я так… оставляю иногда, когда в тему пишут, и ссылок не прячут :)

    comment-bottom
  3. naxellar Says:

    smiley, да куда уж подробнее?

    comment-bottom
  4. smiley Says:

    Все замечательно, только бы подробнее.

    comment-bottom
  5. naxellar Says:

    Проглядел. Исходя из написанного там, сделал вывод: используются строки по одному байту на символ, следовательно ни о каком Unicode речи быть не может. Однако, я не исключаю возможности использования строк с Unicode другими способами.

    comment-bottom
  6. admin Says:

    Я в скриптинге amx мало, что понимаю :)
    Логичнее почитать в теме http://forums.alliedmods.net/showthread.php?t=91207 ,либо в ней же спросить.

    comment-bottom
  7. naxellar Says:

    Что-то мне подсказывает, что в строках используется Unicode, как бы это уточнить?

    comment-bottom

RSS лента комментариев к этой записи. TrackBack URL