如何将字符串向量中的每个单词更改为大写

How to change each word in a string vector to upper case

我在询问有关读取一系列单词并将值存储在向量中的信息。然后继续将向量中的每个单词更改为大写,并将关于八个单词的输出打印到一行。我认为我的代码要么很慢要么 运行 无限,因为我似乎无法实现输出。

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

我将在这里重写我的答案:

您的外部 for 循环定义 index 循环通过 text,但您从不在其中使用 index。内循环使用word,但word仍然是用户输入的最后一个。您应该更改内部循环,使其使用 index 而不是 word,如下所示:

for ( auto it = index->begin(); it != index->end(); ++it)

至少据我所知,这里的想法是忽略现有的行结构,每行写出 8 个单词,而不考虑输入数据中的换行符。假设这是正确的,我将从仅从输入中读取单词开始,而不注意现有的换行符。

从那里开始,就是将单词大写、写出来,以及(如果是 8 的倍数,换行。

我也会对大部分工作使用标准算法,而不是编写自己的循环来执行诸如读取和写入数据之类的 pars。由于该模式基本上只是读取一个单词,对其进行修改,然后写出结果,因此它非常适合 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,嵌套在第一个 lambda 中,但是 IMO,开始变得有点不可读了。同样,我们可以使用 std::tranform 来实现 to_upper.

内部的大写转换

这实际上是一个无限循环:

while (getline(cin, word)) {
    text.push_back(word);
}

getline(cin, word) 从标准输入中读取一行(以 '\n' 结尾),并将其放入 word。然后它 returns cin 本身(如果读取成功,它将评估为 true )。您似乎正在使用它来获取一个 space 分隔的单词,而不是整行,但这不是它的作用。因为你把它放在while的条件下,你输入一行后,它会等待下一行。

此循环仅在 getline 失败时中断。例如,通过点击文件结尾字符。我希望您正在使用控制台并按 Enter 键。在这种情况下,您永远不会导致 getline 失败。 (如果您将文件输入标准输入,它应该可以工作。)

对此的典型解决方案是使用某种方式来指示停止(例如 "Enter an empty line to stop" 或 "Write \"STOP\" 停止",然后在插入之前检查它线到矢量)。对于您来说,解决方案是读入一行,然后将其分解成单词(例如,使用 sstream 库)。

您可以通过查看 CPU 使用情况来检测程序是否正在执行实际工作(而不是等待更多输入)。在 Windows 中,这是 CTRL+SHIFT+ESC -> Performance,和 -> Processes 以查看您的程序。您会发现该程序实际上并未使用 CPU(因为它正在等待更多输入)。

您应该尝试在您的程序中插入 print 语句以弄清楚它到达了哪里。你会发现它永远不会超过 for 循环。