Арифметика на строках C ++

Этот код действительно смущает меня, он использует некоторые библиотеки Стэнфорда для класса Vector (массив). Может кто-нибудь сказать мне, какова цель int index = line [j] - 'a'; почему’?

void countLetters(string filename)
{
Vector<int> result;

ifstream in2;
in2.open(filename.c_str());
if (in.fail()) Error("Couldn't read '" + filename + "'");

for (int i = 0; i < ALPHABETH_SIZE; i++)
{
result.add(0);  // Must initialize contents of array
}

string line;
while (true)
{
getLine(in, line);
// Check that we got a line
if (in.fail()) break;

line = ConvertToLowerCase(line);
for (int j = 0; j < line.length(); j++)
{
int index = line [j] - 'a';
if (index >= 0 && index < ALPHABETH_SIZE)
{
int prevTotal = result[index];
result[index] = prevTotal +1;
}
}
}
}

Назначение кода:

Принимает имя файла и печатает, сколько раз каждая буква алфавита появляется в этом файле. Поскольку необходимо напечатать 26 чисел, CountLetters должен создать вектор. Например, если файл:

0

Решение

Символы в строке кодируются с использованием набора символов … обычно ASCII на аппаратных средствах, распространенных в системах на английском языке. Вы можете увидеть таблицу ASCII на http://en.wikipedia.org/wiki/ASCII

В ASCII (и большинстве других наборов символов) числа, представляющие буквы, являются смежными. Итак, это естественный способ проверить, является ли символ в индексе j в массиве символов line это письмо:

line[j] >= 'a' && line[j] <= 'z'

Ваша программа эквивалентна этому, в алгебраическом смысле она вычитает a с обеих сторон (зная, что a является первым символом в наборе символов):

line[j] >= 'a' - `a` && line[j] <= 'z' - `a`

line[j] >= 0 && line[j] <= 'z' - `a`

Замена «<знак равно za«с эквивалентом:

line[j] >= 0 && line[j] < ALPHABET_SIZE

где ALPHABET_SIZE равно 26. Это торгует зависимость от знания z является последним символом вашего набора символов для того, чтобы знать, сколько символов в вашем наборе символов — оба немного хрупки, но хорошо, если вы знаете, что имеете дело с хорошо известной стабильной кодировкой набора символов.

Лучший способ проверить наличие письма — использовать isalpha() сказуемое: http://www.cplusplus.com/reference/clibrary/cctype/isalpha/

2

Другие решения

«а» находится в начале символов ASII.

int index = line [j] — ‘a’;
if (index> = 0 && индекс < ALPHABETH_SIZE)

Эти две строки кода предназначены только для того, чтобы строка [j] была символом.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector