簡體   English   中英

C ++字符串的算術運算

[英]Arithmetic on C++ strings

這段代碼確實讓我感到困惑,它在Vector(數組)類中使用了一些斯坦福庫。 誰能告訴我int index = line [j] - '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。 例如,如果文件為:

“ a”是ASII字符的開頭。

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

這兩行代碼僅用於line [j]是字符。

字符串中的字符使用字符集進行編碼...通常在英語系統中常見的硬件上為ASCII。 您可以在http://en.wikipedia.org/wiki/ASCII上看到ASCII表

在ASCII(和大多數其他字符集)中,代表字母的數字是連續的。 因此,這是測試字符數組line中索引j的字符是否為字母的自然方法:

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

您的程序等效於此a從某種意義上講,它從兩邊都減去a (知道a是字符集中的第一個字符):

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

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

用等價的z替換“ <= z - a ”:

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

其中ALPHABET_SIZE為26。這要依賴於知道z是字符集的最后一個字符,以便知道字符集中有多少個字符-兩者都有些脆弱,但是如果您知道自己要處理的很好,那就很好了-已知的穩定字符集編碼。

檢查字母的更好方法是使用isalpha()謂詞: http : isalpha()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM