【华为od刷题(C++)】HJ31 单词倒排(字符串流)

我的代码:

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

该程序的功能是:

  1. 读取一行文本
  2. 将文本中的非字母字符转换为空格,保留字母
  3. 将修改后的文本按空格分割为单词,存入向量 vec 中
  4. 逆序输出所有单词,单词之间用空格分隔,最后一个单词不输出空格

#include <sstream> 是 C++ 中引入 字符串流stringstream)相关功能的头文件 

sstream 的作用:

<sstream> 提供了与流操作相关的功能,可以让你像操作文件流、输入流、输出流那样操作字符串;它定义了字符串流类,用于从字符串中读取数据或将数据写入字符串中

具体来说,<sstream> 包含以下主要类:

  1. stringstream:用于将字符串作为流进行处理,既可以从字符串中提取数据,也可以向字符串中写入数据
  2. istringstream:继承自 stringstream,专门用于从字符串中读取数据(输入流)
  3. 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,然后将整数 num1num2 写入流中;最后,使用 str() 方法将流中的内容转换成字符串并输出

总结:

<sstream> 提供了三种主要的字符串流类型,它们使得字符串可以像输入输出流一样进行处理;具体来说,stringstream 用于从字符串中提取数据或将数据写入字符串,istringstreamostringstream 分别专注于只读和只写的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值