0

このコードは本当に私を混乱させます、それはVector(配列)クラスのためにいくつかのStanfordライブラリを使用しています。誰かが理由を教えてもらえますか-'a 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はVectorを作成する必要があります。たとえば、ファイルが次の場合:

4

2 に答える 2

2

「a」はASII文字の先頭にあります。

int index = line [j]-'a'; if(index> = 0 && index <ALPHABETH_SIZE)

これらの2行のコードは、line[j]が文字である場合にのみ使用されます。

于 2012-11-09T05:16:46.917 に答える
2

文字列内の文字は、文字セットを使用してエンコードされます...通常、英語システムで一般的なハードウェア上のASCIIです。ASCIIテーブルはhttp://en.wikipedia.org/wiki/ASCIIで見ることができます

ASCII(および他のほとんどの文字セット)では、文字を表す数字は連続しています。jしたがって、これは、 character-arrayのインデックスにある文字が文字であるかどうかをテストする自然な方法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 に答える