0

基本的に、私はこのチュートリアルに従っています: http://cplussplussatplay.blogspot.com.cy/2012/11/text-adventure-games-c-part-1.html

これを除いて、私は今まですべてを理解しました:

// Make words upper case
// Right here is where the functions from cctype are used
    for(i = 0; i < words.size(); i++)
    {
        for(j = 0; j < words.at(i).size(); j++)
        {
            if(islower(words.at(i).at(j)))
            {
                words.at(i).at(j) = toupper(words.at(i).at(j));
            }
        }
    }

この時点で、文字でいっぱいの単語ベクトルがあります。2 つの for ループの必要性も、この words.at(i).at(j)) も理解していません。それは2Dベクトルか何かですか?

前もって感謝します。

編集:ご協力いただきありがとうございます!私は今それを理解しました!Stack Overflow を使用するのはこれが初めてで、今のところ気に入っています。:)

もう1つ、別の質問が発生しました!

string sub_str;
vector words;
char search = ' ';



    // Clear out any blanks
    // I work backwords through the vectors here as a cheat not to       invalidate the iterator
    for(i = words.size() - 1; i > 0; i--)
    {
        if(words.at(i) == "")
        {
            words.erase(words.begin() + i);
        }

1. 2 番目のコメントの意味は?

2.ベクトルに空白が存在するのはなぜですか? 作成者によると、最初のループは空白をクリアします。これは以前のコードです:

for(i = 0; i < Cmd.size(); i++)
    {
        if(Cmd.at(i) != search)
        {
            sub_str.insert(sub_str.end(), Cmd.at(i));
        }
        if(i == Cmd.size() - 1)
        {
            words.push_back(sub_str);
            sub_str.clear();
        }
        if(Cmd.at(i) == search)
        {
            words.push_back(sub_str);
            sub_str.clear();
        }
    }

再度、感謝します!

4

3 に答える 3

2

コードを説明するコメントを追加します。

// Make words upper case
// Right here is where the functions from cctype are used
for(i = 0; i < words.size(); i++) // for each word in the vector "words"
{
    for(j = 0; j < words.at(i).size(); j++) // for each character in the word "words[i]"
    {
        if(islower(words.at(i).at(j)))      // if the character is lower case...
        {
            words.at(i).at(j) = toupper(words.at(i).at(j)); // ...make upper case
        }
    }
}

したがって、外側のループは各単語を反復し、次に内側のループは現在の単語の各文字を反復し、小文字の場合は大文字に変更します。

文字を変更する行を次のようにする方が少し効率的だと思います。

words.at(i).at(i) -= 32; // ...make upper case

関数呼び出しを必要としない: を呼び出すためのジャンプ、プッシュ、およびポップ マシン命令toupper()。同じ関数 (したがってスタック フレーム) 内での即時アドレッシングを許可するだけです。

于 2016-06-26T13:46:07.550 に答える
1

iある単語のインデックスです。j特定の文字のインデックスです。アルゴリズムは、単語ごとに循環しchar、次の単語を処理します。

于 2016-06-26T13:40:26.820 に答える
1

最初のループはwordベクトルを繰り返し(最初の単語から位置の最後の単語までword.size - 1)、次に2番目のループはすべての単語の文字を通過します。j位置の単語の位置の文字iが小文字の場合は、大文字にします

于 2016-06-26T13:43:45.733 に答える