为什么我的嵌套循环不检查向量的第二个元素(空字符串)?

Why does my nested loop not check the second element of vector (empty string)?

我有点卡在这上面了。我的代码应该在遇到第一个空字符串( text[1] )时停止大写字符。但是当我放置一个断点并向前迈进时;第三根弦被认为紧接在第一根弦之后。第二个元素被忽略。练习是打印所有字符串,但只将第一个字符串大写。

#include <vector>


int main()
{
    std::vector<std::string> text = { "One, two, three-four-five. Once I caught a fish alive.", "", "Six, seven, eight-nine-ten. Then I let it go again.", "", "Why did I let it go? Because he bit my finger so.", "", "Which finger did he bite? This little finger on my right!"};

    for (auto it = text.begin(); it != text.end(); ++it) {
        for (auto it2 = it->begin(); it2 != it->end() && !it->empty(); ++it2) { //empty string in text[2] never satisfies second condition
            *it2 = toupper(*it2);
        }
        std::cout << *it << std::endl;
   };
}

知道为什么吗?谢谢

如果我没理解错的话,你想在第一个空字符串之后停止大写,而不是在第一个空字符之后,比如:

ONE, TWO, THREE-FOUR-FIVE. ONCE I CAUGHT A FISH ALIVE.

Six, seven, eight-nine-ten. Then I let it go again.

Why did I let it go? Because he bit my finger so.

Which finger did he bite? This little finger on my right!

这可以只用一个循环并转换整个字符串来完成:

int main()
{
    std::vector<std::string> text { "One, two, three-four-five. Once I caught a fish alive.", "", "Six, seven, eight-nine-ten. Then I let it go again.", "", "Why did I let it go? Because he bit my finger so.", "", "Which finger did he bite? This little finger on my right!"};

   for (auto it = text.begin(); it != text.end() && !it->empty(); ++it) {
       std::transform(it->begin(), it->end(),it->begin(), ::toupper);
   };
   
   for (auto const& str : text) {
       std::cout << str << std::endl;
   }
}

注意:正如@user4581301 所指出的,请记住负值(如扩展 ASCII)会产生 UB,您应该决定要做什么(即,按照评论中的建议通过 [](unsigned char c){ return std::toupper(c); } 进行转换) .