C++ vector 打印出奇怪的元素

C++ vector prints out weird elements

我目前正在学习 C++,为此我正在阅读《C++ 入门》一书。到目前为止,这本书非常好,我学到了很多东西,但是我在使用向量时遇到了奇怪的行为,我不确定这是对的还是我这边的问题。

任务是:

Read a sequence of words from cin and store the values a vector. After you've read all the words, process the vector and change each word to uppercase. Print the transformed elements, eight words to a line."

这是我的代码:

#include <iostream>
#include <vector>

using namespace::std;

int main()
{
    string input;
    vector<string> svec;

    while (cin >> input)
    {
        svec.push_back(input);

        for (auto& rows : svec)
        {
            for (auto& element : rows)
            {
                element = toupper(element);
            }
        }

        int maxWordsPerLine = 0;

        for (auto word : svec)
        {
            if (maxWordsPerLine >= 8)
            {
                cout << endl;
                cout << word;
                maxWordsPerLine = 1;
            }
            else
            {
                cout << word;
                maxWordsPerLine++;
            }
        }
    }
}

我相信它会完成任务中描述的事情,但是当我输入时:

Hello thanks for helping I dont know whats wrong with this problem lol

输出为:

HELLOHELLOTHANKSHELLOTHANKSFORHELLOTHANKSFORHELPINGHELLOTHANKSFORHELPINGIHELLOTHANKSFORHELPINGIDONTHELLOTHANKSFORHELPINGIDONTKNOWHELLOTHANKSFORHELPINGIDONTKNOWWHATSHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHTHISHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHTHISPROBLEMHELLOTHANKSFORHELPINGIDONTKNOWWHATS
WRONGWITHTHISPROBLEMLOL

我希望有人能向我解释为什么会发生这种情况以及我以后如何避免这种情况。

你需要意识到有两个步骤。

第一步:读取所有单词并将每个单词转换为大写

第二步:打印所有单词

第一步完成后需要进行第二步。但是,您只有一个 while 循环。不是 运行,但看起来可能有效的最简单更改是:

string input;

vector<string> svec;

while (cin >> input)
{
    svec.push_back(input);

    for (auto& rows : svec)
    {
        for (auto& element : rows)
        {
            element = toupper(element);
        }
    }
} // extra closing bracket for the while

    int maxWordsPerLine = 0;

    for (auto word : svec)
    {
        if (maxWordsPerLine >= 8)
        {
            cout << endl;

            cout << word << " "; // extra space to separate words

            maxWordsPerLine = 1;
        }
        else
        {
            cout << word;

            maxWordsPerLine++;
        }
    }

对于初学者,您需要包括 header <string>

#include <string>

在这个 while 循环中

while (cin >> input)
{
    svec.push_back(input);

    for (auto& rows : svec)
    {
        for (auto& element : rows)
        {
            element = toupper(element);
        }
    }
    //...

您正在一次又一次地将给定迭代中输入的所有单词转换为大写。

并且输出向量必须从 while 循环中移除。

所以 while 循环可以如下所示

while ( cin >> input )
{
    svec.push_back(input);

    for ( auto& element : svec.back() )
    {
        element = toupper(element);
    }
}

之后就可以输出向量了。

并在此范围内基于for循环

for (auto word : svec)

您不应创建存储在向量中的字符串的副本。您应该将变量 word 声明为具有常量引用类型

for ( const auto &word : svec)

此外,内部 if 语句包含重复代码,这不是一种好的编程风格。

        if (maxWordsPerLine >= 8)
        {
            cout << endl;

            cout << word;

            maxWordsPerLine = 1;
        }
        else
        {
            cout << word;

            maxWordsPerLine++;
        }

在基于for循环的范围内重写if语句,例如下面的方式

        cout << word << ' ';

        if ( ++maxWordsPerLine == 8)
        {
            cout << endl;
            maxWordsPerLine = 0;
        }