【算法竞赛】如何用c++的stringstream处理输入输出

目录


前言

本文主要介绍如何使用stringstream处理在算法练习或竞赛中遇到的输入输出问题。


一、stringstream是什么?

stringstream 是 C++ 提供的专门用于处理字符串的输入输出流类。

这里稍微提一下c++中“流”的概念。在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被创建,使用后要被删除。数据的输入与输出是通过 I/O 流实现的,cin 和 cout 是c++预定义的流类对象。

 

二、stringstream的用途

<sstream> 主要用来进行数据类型转换,由于 <sstream> 使用 string 对象来代替字符数组(snprintf 方式),避免了缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符号的问题。简单说,相比 C 编程语言库的数据类型转换,<sstream> 更加安全、自动和直接。

三、使用步骤

1.引入库

#include <sstream>

2.示例代码

2.1 数据类型转换

这里展示一份示例代码,介绍将 string 类型转换为 int 类型的过程。

string result = "10000";  
int n = 0;  
stream << result;  
stream >> n;  //n等于10000 

2.2 stringstream的成员函数clear()

使用场景:在进行多次转换的时候,必须调用stringstream的成员函数.clear()

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
 
int main()
{
	stringstream ss;
	int first = 0, second = 0;
 
	ss << "456";  // 插入字符串
	ss >> first;  //转换成int
	cout << first << endl;
 
	ss.clear();  //在进行多次转换前, 必须清除ss
	ss << true;
	ss >> second;
	cout << second << endl;
 
	return 0;
}

运行结果:

运行.clear()结果:

没有运行.clear()结果:

2.3 stringstream的成员函数str()

示例代码的内容如下:

#include <string>
#include <sstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    stringstream sstream;
 
    // 将多个字符串放入 sstream 中
    sstream << "first" << " " << "string,";
    sstream << " second string";
    cout << "strResult is: " << sstream.str() << endl;
 
    // 清空 sstream
    sstream.str("");
    sstream << "third string";
    cout << "After clear, strResult is: " << sstream.str() << endl;
 
    return 0;
}

运行结果:

运行.str() 结果:

没有运行.str() 结果:

从上述代码执行结果能够知道:

  • 可以使用 str() 方法,将 stringstream 类型转换为 string 类型;
  • 可以将多个字符串放入 stringstream 中,实现字符串的拼接目的;
  • 如果想清空 stringstream,必须使用 sstream.str(""); 方式;clear() 方法适用于进行多次数据类型转换的场景。

2.4 算法题目

題目:输入的第一行有一个数字 N 代表接下來有 N 行资料,每一行资料里有不固定个数的整数(最多20个,每行最大200个字元),编程將每行的总和打印出來。

输入:

3
1 2 3
20 17 23 54 77 60
111 222 333 444 555 666 777 888 999

输出:

6
251
4995

代码:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    string s;
    stringstream ss;
    int n;
    cin >> n;
    getline(cin, s);  //读取换行

    for (int i = 0; i < n; i++)

    {
        getline(cin, s);
        ss.clear();
        ss.str(s);

        int sum = 0;
        while (1)
        {
            int a;
            ss >> a;

            /**错误处理函数fail及其功能
             *如果出现一个不可恢复的错误或一个预期的条件,   
             *例如一个转换错误或文件未找到,则返回一个非0值。
             *在用零参量调用clear后,错误标记被清除。
            */

            if(ss.fail())    
                break;

            sum += a;
        }

        cout << sum << endl;
    }
    return 0;


四、参考资料:

(110条消息) string和stringstream用法_李典金的博客-CSDN博客_string stringstream

(110条消息) C++中头文件iostream介​​​​​​绍_fengbingchun的博客-CSDN博客_<iostream>

(110条消息) C++编程语言中stringstream类介绍_liitdar的博客-CSDN博客_stringstream

郑莉《C++语言程序设计》(第4版)

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值