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

时间:2015-03-01 22:37:18

标签: c++ string vector

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

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

3 个答案:

答案 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::tranformto_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循环。