【问题标题】:C++ vector prints out weird elementsC++向量打印出奇怪的元素
【发布时间】:2021-12-30 12:59:53
【问题描述】:

我目前正在学习 C++,为此我正在阅读“C++ Primer”一书。到目前为止,这本书非常好,我学到了很多东西,但是我在使用矢量时遇到了奇怪的行为,我不确定这是否正确,或者这是否是我这边的问题。

任务是:

cin 读取一系列单词并将值存储为vector。阅读所有单词后,处理vector 并将每个单词更改为大写。打印转换后的元素,一行八字。”

这是我的代码:

#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

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

【问题讨论】:

  • 不相关:在将字符串添加到向量之前将其转换为大写。现在,每次向向量添加项目时,都会将向量中的每个字符串都转换为大写,包括那些已经转换的字符串。 Read this for more,尤其是关于画家什莱米尔的那一点。
  • 这里同时发生了几个问题。首先,当您打印svec 的内容时,您不会在单词之间打印任何空格。其次,您的打印循环在您的 `while(cin >> input)` 循环中。因此,每次添加一个单词时,您都会打印在此之前添加的所有单词。
  • 尝试以编程方式设置input 的值。只需将文本粘贴到代码中即可对其进行硬编码。如果输出正常,那么问题出在 cout 或 cin 上。如果是这样的话,你可以通过cin正常输入文本,不修改就直接输出,看看是否存储正确。如果是,那么问题出在您的算法或 cin 中。我在 godbolt.org 中运行了你的代码,文本是硬编码的,输出很好(while 的第一次迭代)。
  • 谢谢大家的回答我不知道在将其存储在向量中之前需要这样做。是的,我忘记了空格,我在创建问题后意识到了这一点。再次感谢大家。
  • 在将其存储在向量中之前,您不需要 执行此操作。您的程序所做的额外工作是不必要的,并非完全不正确。现在,正如所写,当您将单词#10 添加到svec 时,您还将单词#1-9 重新转换为大写,这只是浪费精力。

标签: c++ loops c++11 while-loop range-based-loop


【解决方案1】:

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

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

第二步:打印所有单词

第一步完成后需要进行第二步。但是,您有一个 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++;
        }
    }

【讨论】:

    【解决方案2】:

    对于初学者,您需要包含标题&lt;string&gt;

    #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;
            }
    

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2014-06-10
      • 2018-09-29
      相关资源
      最近更新 更多