如何将字符串向量中的每个单词更改为大写
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 循环。
我在询问有关读取一系列单词并将值存储在向量中的信息。然后继续将向量中的每个单词更改为大写,并将关于八个单词的输出打印到一行。我认为我的代码要么很慢要么 运行 无限,因为我似乎无法实现输出。
#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 循环。