0

这段代码真的让我很困惑,它使用了一些斯坦福库的向量(数组)类。谁能告诉我int index = line [j] - 'a';为什么-'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 需要创建一个 Vector。例如,如果文件是:

4

2 回答 2

2

“a”在 ASII 字符的开头。

int index = line [j] - 'a'; 如果(索引 >= 0 && 索引 < ALPHABETH_SIZE)

这两行代码就是如果 line[j] 是一个字符。

于 2012-11-09T05:16:46.917 回答
2

字符串中的字符使用字符集进行编码......通常是英语语言系统中常见的硬件上的 ASCII。您可以在http://en.wikipedia.org/wiki/ASCII查看 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`

将“<= z- a”替换为等价物:

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

其中 ALPHABET_SIZE 是 26。这将依赖于知道z是字符集中的最后一个字符,而不是知道字符集中有多少个字符 - 两者都有点脆弱,但如果你知道你正在处理一个众所周知的,稳定的字符集编码。

检查字母的更好方法是使用isalpha()谓词:http ://www.cplusplus.com/reference/clibrary/cctype/isalpha/

于 2012-11-09T05:30:35.173 回答