我的代码:
#include<iostream>//引入标准输入输出流库,用于处理 cin 和 cout
#include<string>//引入字符串类库,用于使用 string 类型
#include<sstream>//引入字符串流库,用于处理字符串的输入输出
#include<vector>//引入向量(动态数组)类库,用于存储单词
using namespace std;
int main() {//main() 是程序的入口函数
string str;//用于存储每行的文本
vector<string> vec;//用于存储所有提取的单词
while (getline(cin, str)) {
//使用 getline() 从标准输入逐行读取文本直到结束
//(通常是按下 Ctrl+D 或 Ctrl+Z 结束输入)
for (int i = 0 ; i < str.size(); ++i) {
//遍历每个字符,检查它是否是字母(通过 isalpha() 判断)
if (!isalpha(str[i])) {
str[i] = ' ';
//如果是非字母字符(数字、标点等),就将其替换为空格
}
}
//以空格作为分割
stringstream stream(str);
//将处理后的字符串 str 传入 stringstream 流中
/*将输入字符串 str 转换成 stringstream 类型的流 stream,
该流能够像读取文件流一样逐字逐词读取字符串*/
while (stream >> str) {
vec.push_back(str);
}//使用流操作符 >> 从字符串流中提取出单词,并将它们逐个存入 vec 向量中
//逆向输出
for (int i = vec.size() - 1; i > 0 ; --i) {
cout << vec[i] << " ";
}//从 vec 向量的最后一个元素开始,逆序输出单词,每个单词后面加一个空格
/*流操作符 >> 的使用方法
它从字符串流 stream 中提取出一个个单词(以空格作为分隔符),
并将每个单词存储在 str 变量中
每次提取到一个单词时,流的读取位置会向后移动,直到没有更多的单词可以读取*/
cout << vec[0];
//输出 vec 中的第一个单词
//注意,这里没有输出空格,因为它是最后一个单词
}
return 0;
}
该程序的功能是:
- 读取一行文本
- 将文本中的非字母字符转换为空格,保留字母
- 将修改后的文本按空格分割为单词,存入向量
vec
中 - 逆序输出所有单词,单词之间用空格分隔,最后一个单词不输出空格
#include <sstream>
是 C++ 中引入 字符串流(stringstream
)相关功能的头文件
sstream
的作用:
<sstream>
提供了与流操作相关的功能,可以让你像操作文件流、输入流、输出流那样操作字符串;它定义了字符串流类,用于从字符串中读取数据或将数据写入字符串中
具体来说,<sstream>
包含以下主要类:
stringstream
:用于将字符串作为流进行处理,既可以从字符串中提取数据,也可以向字符串中写入数据istringstream
:继承自stringstream
,专门用于从字符串中读取数据(输入流)ostringstream
:继承自stringstream
,专门用于将数据写入字符串中(输出流)
使用示例:
假设你有一个字符串,你希望像读取文件流一样读取它,或者你希望将某些数据输出到一个字符串中,你就可以使用 stringstream
示例 1:从字符串读取数据(istringstream
)
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string data = "123 456 789";
istringstream stream(data); // 用字符串初始化流
int num1, num2, num3;
stream >> num1 >> num2 >> num3; // 逐个从流中读取数据
cout << num1 << " " << num2 << " " << num3 << endl; // 输出: 123 456 789
return 0;
}
在这个例子中,我们创建了一个 istringstream
对象 stream
,它初始化时就会使用字符串 data;
然后,我们可以像从输入流中读取数据一样,使用 >>
操作符从 stream
中提取整数
示例 2:将数据写入字符串(ostringstream
)
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream stream; // 创建一个输出字符串流
int num1 = 123, num2 = 456;
stream << num1 << " " << num2; // 将数据写入字符串流
string result = stream.str(); // 获取流中内容作为字符串
cout << result << endl; // 输出: 123 456
return 0;
}
在这个例子中,我们创建了一个 ostringstream
对象 stream
,然后将整数 num1
和 num2
写入流中;最后,使用 str()
方法将流中的内容转换成字符串并输出
总结:
<sstream>
提供了三种主要的字符串流类型,它们使得字符串可以像输入输出流一样进行处理;具体来说,stringstream
用于从字符串中提取数据或将数据写入字符串,istringstream
和 ostringstream
分别专注于只读和只写的操作