【发布时间】: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