C++ stringstream格式化输出输入探索
- 最近在笔试时经常遇见各种输入问题,于是细心总结一波;
- 首先string str; cin>>str;遇到空格结束;
- 于是乎产生了getline(),可与得到一行字符串;空格自动去掉,只要不讲cin和getline混用即可
、cin.getline(s,k); 接收一行中k个字符,可以接收空格
cin.getline()实际有三个参数,cin.getline(字符串,接收个数,结束字符);
当第三个参数省略时,系统默认为'\0'; 、getline(cin,s); 和cin.getline()类似,读入一行字符串,值得注意的是cin.getline()属于istream流,而getline()属于string流,二者并不相同。
StringStream
这个东西单独讲,比较重要,包含在sstream库中。
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
stringstream类同时可以支持C风格的串流的输入输出操作。
然后stringstream的作用就是从string对象读取字符或字符串。
string s = "ABCD";
stringstream ss(s);
char ch;
while(ss>>ch){
cout << ch << " ";
} //运行结果
//A B C D
又例如
string s = "hello world";
stringstream ss(s);
string str;
while(ss>>str){
cout << str << " ";
} //运行结果
//hello world
在某些题目需要处理字符串时,这些题目往往是输入的一行中包含多个字符以及空格,这个时候就可以利用 stringstream进行单个字符或者单个字符串分析处理了
- 例子程序:
int main()
{ string line;
int k = ;
cout << "===============case1================" << endl;;
while (getline(cin, line)) //可与读到包含空格, ;等字符;但是在ss>>x时被截断
{
int sum = , x;
stringstream ss(line);
while (ss >> x)
{
sum += x;
}
cout << "the sum is :" << sum << endl;
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
} return ;
}
- 输出
===============case1================ the sum is : ===============case2================
,,,,
the sum is : ===============case3================
a b
the sum is : ===============case4================
a
the sum is : ===============case5================
- 另外一组:
int main()
{ string line;
int k = ; cout << "===============case1================" << endl;;
while (getline(cin, line))
{
string out, x;
stringstream ss(line);
while (ss >> x)
{
cout << x << ";";
}
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
} return ;
}
- 输出:
===============case1================
this is very good!
this;is;very;good!;
===============case2================
this,is,very,good!
this,is,very,good!;
===============case3================
- 实验矩阵类型的输入:
3
0 1 2
2 3 4
5 6 7
int main()
{ string line;
int k = ;
//测试矩阵形式的输入:
string input;
int n;
//cin >> n; //输入n行数据,如果后面用getline()后面的换行符不能处理
getline(cin, input);
stringstream ss(input);
ss >> n; vector<vector<int> > vec;
for (int i = ; i < n;i++)
{
getline(cin,input); //会将换行符当做一行
stringstream ss(input);
int x; vector<int> temp;
while (ss>>x) //只能以空格处理分离
{
temp.push_back(x);
}
vec.push_back(temp);
} return ;
}
- 使用方法:
- input1是没有空格的,带有,;将矩阵的行列分出来;
- 但是使用cin>>k后,没有使用getline(input1), 应为input1本身是没有空格的字符串
- 经上面启发:练习这样的输入:
, ,;, ,;, ,;, ,;, ,;, ,;, ,;, ,;, ,
- 测试代码:
int main()
{ string line;
int k = ; int row, col;
getline(cin, line);
stringstream ss(line);
ss >> row >> col;
getline(cin, line); //第二行
stringstream s(line);
string temp1, temp2, temp3;;
vector<pair<pair<int,int>,pair<int,int>>> vec;
while (getline(s, temp1, ';'))
{
vector<pair<int, int>> pair1;
stringstream s3(temp1);
while (getline(s3, temp2,' ')) //以换行符结束,中间为空格
{
pair<int, int> pair2;
stringstream s4(temp2);
vector<int> res;
while (getline(s4, temp3, ','))
{
res.push_back(stoi(temp3));
}
pair2.first = res[];
pair2.second = res[]; pair1.push_back(pair2);
} vec.push_back(make_pair(pair1[],pair1[]));
} return ;
}
- 输出:
- 另外参考输入遇到过问题的拼多多题解:推荐朋友 - LintCode
int main()
{
int N, id;
string str;
getline(cin, str);
stringstream ss(str);
ss >> N >> id; vector<vector<int>> vec;
//for (int i = 0; i < N; i++)
//{
// vector<int> temp;
// int user;
// getline(cin, str);
// stringstream s(str);
// while (s>>user) //以空格进行划分
// {
// temp.push_back(user);
// }
// vec.push_back(temp);
//} while (getline(cin, str)) //其实可都可以不知道行数
{
vector<int> temp;
int user;
stringstream s(str);
while (s >> user)
{
temp.push_back(user);
}
vec.push_back(temp);
} cout << recommendFriends(vec, id) << endl; return ;
} int test()
{
//int N,id;
//cin >> N >> id; //直接输入用户数和需要查找的用户id ; 这样就会产生换行符 int N;
vector<int> in;
char c;
while ((c = cin.get()) != '\n')
{
cin.unget();
cin >> N;
in.push_back(N);
} vector<vector<int>> vec;
for (int i = ; i < in[]; i++)
{
vector<int> temp;
int user; while ((c=cin.get())!= '\n') //文件结果没有换行符了,所以陷入死循环
{
cin.unget();
cin >> user;
temp.push_back(user);
}
if (temp.size()!=)
{
vec.push_back(temp);
} } cout << recommendFriends(vec, in[]) << endl; return ;
}
- 全部代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <unordered_set> #include<sstream>
#include<fstream>
using namespace std; #define cin infile //一定不能再oj系统中,有错,导致超时等!!!
//C++文件输入
ifstream infile("ini.txt", ifstream::in); //函数功能:将输入字符串s,以字符串c(;)进行拆分,拆分结果放在v中
//函数参数说明:s为输入字符串;c为拆分的字符串;v为拆分结果
//函数返回值:正常返回0
int split_string(const std::string& s, std::vector<std::string>& v, const std::string& c)
{
std::string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = ;
while (std::string::npos != pos2)
{
v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if (pos1 != s.length())
v.push_back(s.substr(pos1));
return ;
} int main()
{ string line;
int k = ;
/*cout << "===============case1================" << endl;;
while (getline(cin, line))
{
int sum = 0, x;
stringstream ss(line);
while (ss >> x)
{
sum += x;
}
cout << "the sum is :" << sum << endl;
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
}*/ //cout << "===============case1================" << endl;;
//while (getline(cin, line))
//{
// string out, x;
// stringstream ss(line);
// while (ss >> x)
// {
// cout << x << ";";
// }
// ++k;
// cout << endl;
// cout << "===============case" << k << "================" << endl;;
//} ////测试矩阵形式的输入:
//string input;
//int n;
////cin >> n; //输入n行数据,如果后面用getline()后面的换行符不能处理
//getline(cin, input);
//stringstream ss(input);
//ss >> n;
//
//vector<vector<int> > vec;
//for (int i = 0; i < n;i++)
//{
// getline(cin,input); //会将换行符当做一行
// stringstream ss(input);
// int x;
// vector<int> temp;
// while (ss>>x) //只能以空格处理分离
// {
// temp.push_back(x);
// }
// vec.push_back(temp);
//} int row, col;
getline(cin, line);
stringstream ss(line);
ss >> row >> col;
getline(cin, line); //第二行
stringstream s(line);
string temp1, temp2, temp3;;
vector<pair<pair<int,int>,pair<int,int>>> vec;
while (getline(s, temp1, ';'))
{
vector<pair<int, int>> pair1;
stringstream s3(temp1);
while (getline(s3, temp2)) //以换行符结束,中间为空格
{
pair<int, int> pair2;
stringstream s4(temp2);
vector<int> res;
while (getline(s4, temp3, ','))
{
res.push_back(stoi(temp3));
}
pair2.first = res[];
pair2.second = res[]; pair1.push_back(pair2);
} vec.push_back(make_pair(pair1[],pair1[]));
} return ;
}
C++ stringstream格式化输出输入探索的更多相关文章
- Python基础之注释,算数运算符,变量,输入和格式化输出
Python的注释 注释的作用:用自己熟悉的语言,对某些代码进行标注说明,增强程序的可读性: 在python解释器解释代码的过程中,凡是#右边的,解释器都直接跳过这一行: 注释的分类 单行注释 # 这 ...
- go语言基础之格式化输出
1.fmt包的格式化输出输入 格式说明 格式 含义 %% 一个%字面量 %b 一个二进制整数值(基数为2),或者是一个(高级的)用科学计数法表示的指数为2的浮点数 %c 字符型.可以把输入的数字按照A ...
- python学习笔记(基础二:注释、用户输入、格式化输出)
注释 单行:# 多行:上下各用3个连续单引号或双引号 3个引号除了多行注释,还可以打印多行 举例: msg = ''' name = "Alex Li" name2 = name ...
- python学习道路(day1note)(变量,注释,用户输入,格式化输出,if,while,for循环并扩展练习)
python是一门动态解释性的强类型定义语言,其应用范围非常之广 1:进入python语言 #!/usr/bin/env python #_*_coding:utf-8_*_ print(" ...
- (Go)06. Printf格式化输出、Scanf格式化输入详解
Print.Println .Printf .Sprintf .Fprintf都是fmt 包中的公共方法,在需要打印信息时需要用到这些函数,那么这些函数有什么区别呢? Print: 输出到控制台(不接 ...
- C++输入输出流 cin/cout 及格式化输出简介
C++ 可通过流的概念进行程序与外界环境( 用户.文件等 )之间的交互.流是一种将数据自源( source )推送至目的地( destination )的管道.在 C++ 中,与标准输入/输出相关的流 ...
- 四、用户交互(输入input,格式化输出)与运算符
1.接收用户的输入 在Python3:input会将用户输入的所有内容都存成字符串类型 列: username = input("请输入您的账号:") # "egon&q ...
- [C/C++] zltabout(带缩进的格式化输出)v1.0。能以相同的代码绑定到 C FILE 或 C++流
作者:zyl910 一.缘由 在写一些生成文本的程序时,经常需要使用带缩进的格式化输出的功能.以前为此写过不少类似的函数,可惜它们的可重用性很差. 这是因为——1) C语言的FILE*不支持重定向到自 ...
- Javascript实现格式化输出
前两天看面试题,其中有一道要实现js的格式化输出,具体给出的是: Javascript实现格式化输出,比如输入999999999,输出为999,999,999 我的实现方式是 function for ...
随机推荐
- Bzoj3122:多项式BSGS
根据鸽笼原理,在p次后一定循环,一眼BSGS.发现他给的函数是个一次函数,一次函数有什么性质呢?f(f(x))还是一次函数,这样就能做了.首先我们暴力预处理出f(f(f(x)))......sqrt( ...
- .net 中的async,await理解
理解: 1.async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异)2.当async方法执行遇到await,则立即将控制权转移到async方法的调用者3.由调用者决定是否需要等 ...
- BZOJ2612 : [Poi2003]Sums
设d[i]表示能拼出的x中满足x%a[0]=i的最小的x,其中d[0]=0. 若d[x%a[0]]<=x,则一定可以拼出x,否则一定不可以. 建出带权有向图,点的标号从0到a[0]-1,i号点向 ...
- c# dapper mysql like 参数化
//拼接sql语句: if (!string.IsNullOrEmpty(model.Email)) { where += " and a.email like @email "; ...
- API测试利器postMan 使用教程
自从开始做API开发之后,我就在寻找合适的API测试工具.一开始不是很想用Chrome扩展,用的 WizTools 的工具,后来试过一次 Postman 之后就停不下来了,还买了付费的Jetpacks ...
- 在SpringMVC中使用@RequestBody注解处理json时,报出HTTP Status 415的解决方案
Spring的@RequestBody非常牛x,可以将提交的json直接转换成POJO对象. 正好今天有这样的需求,使用一下,结果一直报415,十分头疼. HTTP 415 错误 – 不支持的媒体类型 ...
- 移植Python2到TQ2440
环境 Python:2.7.13 开发板: TQ2440 工具链: arm-none-linux-gnueabi-gcc 4.8.3 概述 前面已经把Python3移植到TQ2440上面的,现在我们移 ...
- 总结ASP.NET MVC视图页使用jQuery传递异步数据的几种方式
在ASP.NET MVC的视图页向控制器传递异步数据,可能是数组,JavaScript对象,json,表单数据,等等. 关于数据,JavaScript对象有时候和json长得一模一样,有么有? var ...
- 在ASP.NET MVC中使用Knockout实践04,控制View Model的json格式内容
通常,需要把View Model转换成json格式传给服务端.但在很多情况下,View Model既会包含字段,还会包含方法,我们只希望把字段相关的键值对传给服务端. 先把上一篇的Product转换成 ...
- java ffmpeg视频转码(自测通过)
import java.io.*; public class VideoTransfer { //ffmepg文件 安装目录 private static String ffmpeg = " ...