【问题标题】:C++ Text adventure game - Make words upper caseC++ 文字冒险游戏 - 让单词大写
【发布时间】:2016-06-26 13:31:31
【问题描述】:

基本上,我正在学习本教程: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));
            }
        }
    }

此时,我们有一个充满字符的词向量。 我不明白两个 for 循环的需要,也不明白这个 words.at(i).at(j))。 是二维向量还是什么?

提前致谢。

编辑:非常感谢大家的帮助!我现在明白了!这是第一次使用 Stack Overflow,到目前为止我很喜欢它! :)

还有一件事,又出现了一个问题!

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.向量中怎么会有空格?根据创建者的第一个循环清除所有空白。 这是之前的代码:

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();
        }
    }

再次感谢!

【问题讨论】:

  • vector words; 嗯,糟糕的教程。
  • 第一个循环结束了单词。第二个是超过一个单词中的字符

标签: c++ text vector adventure


【解决方案1】:

我将添加 cmets 来遍历代码:

// 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()。只允许在同一函数内立即寻址(因此堆栈帧)。

【讨论】:

  • 这应该是“少一个访问”吗?在这两种情况下,都必须读取值,然后分配一个新值
【解决方案2】:

i是某个词的索引。 j 是某个字符的索引。 该算法循环遍历一个单词的每个char,然后处理下一个单词。

【讨论】:

    【解决方案3】:

    第一个循环遍历您的word 向量(从第一个单词到位置word.size - 1 的最后一个单词),然后第二个循环遍历所有单词字符。如果i位置的单词的j位置的字符是小写的,则改为大写

    【讨论】:

    • 顺便说一句,如果 word 只是一个数组,我无法理解为什么你使用像“at(i)”这样的函数
    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多