我正在询问阅读一系列单词并将值存储在向量中。然后继续将矢量中的每个单词更改为大写,并将关于八个单词的输出打印到一行。我认为我的代码要么慢,要么无限运行,因为我似乎无法实现输出。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string word;
vector<string> text;
while (getline(cin, word)) {
text.push_back(word);
}
for (auto index = text.begin(); index != text.end(); ++index) {
for ( auto it = word.begin(); it != word.end(); ++it)
*it = toupper(*it);
/*cout<< index << " " << endl;*/
}
for (decltype(text.size()) i = 0; i != 8; i++)
cout << text[i] << endl;
return 0;
}
答案 0 :(得分:1)
至少据我所知,这里的想法是忽略现有的行结构,并且每行写出8个单词,而不管输入数据中的换行符。假设这是正确的,我首先只是从输入中读取单词,而不关注现有的换行符。
从那里开始,这是一个大写单词,写出来的问题,(如果你是8的倍数,那就是新行。
我还会在大多数工作中使用标准算法,而不是编写自己的循环来执行诸如读取和写入数据之类的解析。由于模式基本上只是读一个单词,修改它,然后写出结果,它很适合std::transform
算法。
执行此操作的代码可能如下所示:
#include <string>
#include <iostream>
#include <algorithm>
std::string to_upper(std::string in) {
for (auto &ch : in)
ch = toupper((unsigned char) ch);
return in;
}
int main() {
int count = 0;
std::transform(
std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout),
[&](std::string const &in) {
char sep = (++count % 8 == 0) ? '\n' : ' ';
return to_upper(in) + sep;
});
}
我们可以实现将每个字符串大写为第二个lambda,嵌套在第一个,但是IMO,它开始变得有点不可读。同样,我们可以使用std::tranform
在to_upper
内部实现大写转换。
答案 1 :(得分:0)
我会在这里重写我的答案:
您的外for
循环定义index
以循环显示text
,但您永远不会在其中使用index
。内循环使用word
,但word
仍然是用户输入的最后一个。您应该更改内部循环,以便它使用index
而不是word
,如下所示:
for ( auto it = index->begin(); it != index->end(); ++it)
答案 2 :(得分:0)
这实际上是一个无限循环:
while (getline(cin, word)) {
text.push_back(word);
}
getline(cin, word)
从stdin读取一行(以'\n'
结尾),并将其放入word
。然后它返回cin
本身(如果读取成功,将评估为true
)。你似乎用它来获得一个以空格分隔的单词,而不是整行,但这不是它的作用。由于您将其置于while
的条件下,在您输入一行后,它将等待另一行。
此循环仅在getline
失败时中断。例如,通过点击文件结束字符。我希望您使用控制台并按Enter键。在这种情况下,您永远不会导致getline
失败。 (如果你要将文件输入stdin,它应该可以工作。)
对此的典型解决方案是采用某种方式指示停止(例如“输入空行停止”或“写入”STOP“停止”,然后在插入之前检查它进入矢量的线)。对您而言,解决方案是读取SINGLE行,然后将其分解为单词(例如,使用sstream
库)。
您可以通过查看CPU使用情况来检测程序是否正在执行实际工作(而不是等待更多输入)。在Windows中,这是CTRL + SHIFT + ESC - &gt;表现,和 - &gt;特别是查看您的计划的流程。您会发现程序实际上并没有使用CPU(因为它正在等待更多输入)。
您应该尝试在程序中插入print语句,以确定它的位置。你会发现它永远不会超过for循环。