B2120 单词的长度
目录
字符串流(String Stream, istringstream):
1.题目描述
-
输入一行单词序列,相邻单词之间由 $1$ 个或多个空格间隔,请对应地计算各个单词的长度。
-
注意:如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没有被空格间开的符号串,都算作单词。
输入格式
-
一行单词序列,最少 $1$ 个单词,最多 $300$ 个单词,单词之间用至少 $1$ 个空格间隔。单词序列总长度不超过 $1000$。
输出格式
-
依次输出对应单词的长度,之间以逗号间隔。
样例 #1
样例输入 #1
She was born in 1990-01-02 and from Beijing city.
样例输出 #1
3,3,4,2,10,3,4,7,5
2.代码
#include <iostream>
#include <sstream> // 包含istringstream的头文件
#include <vector> // 包含vector的头文件
using namespace std;
int main()
{
string input; // 声明一个string类型的变量用于存储输入的字符串
getline(cin, input); // 从标准输入读取一行字符串,并存储到input中
istringstream iss(input); // 创建一个istringstream对象,将input字符串包装成输入流
string word; // 声明一个string类型的变量用于存储单词
vector<int> word_lengths; // 声明一个vector,用于存储每个单词的长度
// 逐个读取单词并计算长度
while (iss >> word)
{
word_lengths.push_back(word.length()); // 将当前单词的长度添加到word_lengths向量中
}
// 输出每个单词的长度,以逗号分隔
for (size_t i = 0; i < word_lengths.size(); ++i)
{
if (i != word_lengths.size() - 1)
{
cout << word_lengths[i] << ","; // 输出当前单词的长度,并跟随逗号
}
else
{
cout << word_lengths[i]; // 如果是最后一个单词,则只输出长度,不跟随逗号
}
}
return 0;
}
这个代码的重点在于:
-
读取用户输入的句子,并将其存储在字符串变量
input
中。 -
使用
std::istringstream
将输入的字符串input
转换为输入流,以便逐个读取其中的单词。 -
逐个读取单词,并计算每个单词的长度,将长度存储在
std::vector<int>
类型的向量word_lengths
中。 -
使用范围循环遍历
word_lengths
向量,输出每个单词的长度。在输出过程中,通过判断当前单词是否为最后一个,决定是否输出逗号分隔。
总体来说,这段代码的重点是对输入字符串的处理,包括读取和分割单词,并最终输出单词的长度。
3.知识点:
字符串流(String Stream, istringstream):
-
在C++中,
istringstream
是输入流的一个类型,它允许你将字符串视为输入源,就像从文件或标准输入流中读取一样。你可以使用>>
运算符从istringstream
中提取数据,就像从cin
中读取一样。它非常适合处理格式化的字符串输入。
3.1将句子整体输入:
例如,如果你想从用户那里获取一个句子,你可以创建一个istringstream
,并将用户输入的字符串赋值给它,然后使用>>
从流中读取单词:
#include <iostream>
#include <sstream>
#include <string>
int main() {
string input;
cout << "Enter a sentence: ";
getline(cin, input); // 获取用户输入的句子
istringstream iss(input); // 创建一个输入流,包含用户输入的句子
string word;
iss >> word; // 从流中读取单词
while (iss >> word) { // 当还有更多单词时,继续读取
cout << word << " ";
}
return 0;
}
3.2逆序输出:
要逆序输出单词,我们可以使用std::reverse_iterator
,它允许我们在容器的末尾开始迭代:
// ...(上面的代码继续) // 使用reverse_iterator逆序输出单词
for (auto it = words.rbegin(); it != words.rend(); ++it)
{
cout << *it << " ";
}
完整例子:
#include <iostream> // 包含输入输出流
#include <sstream> // 包含字符串流
#include <string> // 包含字符串处理函数
#include <vector> // 包含向量容器
#include <algorithm> // 包含逆序迭代器
int main() {
std::string input; // 声明一个string类型的变量用于存储输入的句子
std::cout << "Enter a sentence: "; // 提示用户输入句子
std::getline(std::cin, input); // 从标准输入读取一行句子,并存储到input中
std::istringstream iss(input); // 创建一个istringstream对象,将input字符串包装成输入流
std::string word; // 声明一个string类型的变量用于存储单词
std::vector<std::string> words; // 声明一个vector,用于存储每个单词
// 逐个读取单词并存储到vector中
while (iss >> word) {
words.push_back(word); // 将当前单词添加到words向量中
}
// 使用reverse_iterator逆序输出单词
for (std::vector<std::string>::reverse_iterator it = words.rbegin(); it != words.rend(); ++it) { // 从逆序迭代器rbegin()开始,到逆序迭代器rend()结束
std::cout << *it << " "; // 输出当前单词,并跟随空格
}
return 0; // 返回0表示程序正常结束
}
这个程序会先获取用户输入的句子,然后读取每个单词并存储在words
向量中,最后逆序输出这些单词。
4.注意
本人使用的是dev-c++较旧的版本,当中部分代码可能在你的版本下可能有误。
这是高版本下的代码供大家参考。
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
int main() {
std::string input;
std::cout << "Enter a sentence: ";
std::getline(std::cin, input); // 从标准输入读取一行字符串,并存储到input中
std::istringstream iss(input); // 创建一个istringstream对象,将input字符串包装成输入流
std::string word;
std::vector<int> word_lengths; // 声明一个vector,用于存储每个单词的长度
// 使用范围循环读取单词并计算长度
while (iss >> word) {
word_lengths.push_back(word.length()); // 将当前单词的长度添加到word_lengths向量中
}
// 使用范围循环输出每个单词的长度,以逗号分隔
for (size_t i = 0; i < word_lengths.size(); ++i) {
std::cout << word_lengths[i]; // 输出当前单词的长度
if (i != word_lengths.size() - 1) { // 如果不是最后一个单词,则输出逗号
std::cout << ",";
}
}
return 0;
}
这是洛谷上的题B2120 单词的长度,这是本人的学习记录罢了,都是非常基础的题分享给大家,做做参考。如果有错误的地方请大家一定要告知本人。再次表示感谢,如果对大家有帮助的话,希望大家点点赞,关注关注。此后会不断的更新。