C/C++中的ACM题目输入处理——简单易上手
这里就不按其他文章的以各种情况为分类方法,而是以方法本身为分类办法。因为有一些方法是不同情况通用的,比如已知数量数字的输入和未知数量数字的输入,其实可以用同一种办法。
输入
C/C++ :scanf正则表达式
头文件<stdio.h>或<cstdio>
普通使用时,语法为scanf("%d",&a),当遇到空格符、换行、Tab时结束输入,并且丢弃这些空格符、换行、Tab键符号。
所以比如说我们读取的字符串有空格符时,或者需要读取特定的字符,就要用到scanf的一些其他用法,语法如下:
1. scanf("%ns",str)//n为整数,读入的字符串最长不超过n,然后在末尾补’\0’
char str[100];
scanf("%5s",str);输入abcdefghcd,最终str为abcde
2. scanf("%nf",&data);//读入的浮点数最多有n位整数,位数多于n,会截断。
float p;
scanf("%5f",&p);输入123,输出为p为123.00000;输入1234567,输出为12345.000000
3. scanf("%n[a-z]",&str);//读入最多n个字符,如果遇到非a-z的字符,停止,同理,%[0-9]表示只读入’0’到’9’之间的字符,%[a-zA-Z]表示只读入字母
4. scanf("%[^c]",&str);//读入任意多的字符,直到遇到字符c为止停止,这种方法主要是读取含空格、tab字符的字符串
char *str;
scanf("%[^\n]%*c",str);//这就是获取一行字符串,遇到换行符停止。%*c的作用是吸收\n,"%*"表示读入后不赋予任何变量,即跳过该输入值,也就是那个换行符,否则他会在缓冲区里,影响下一次输入
对于第四点,我们做个实验,先写如下代码运行
char a[500];
char b[500];
scanf("%[^\n]",a);
scanf("%[^\n]",b);
printf("%s",a);
printf("%s",b);
结果:输入abcd,换行,马上就输出了abcd,程序结束。
进行更改代码如下,运行
char a[500];
char b[500];
scanf("%[^\n]%*c",a);
scanf("%[^\n]%*c",b);
printf("%s",a);
printf("%s",b);
结果:输入abcd,换行,继续输入efg,换行,程序输出abcdefg,结束。
原因是,第一个程序中,第一个scanf输入abcd和换行,遇到换行了,于是输入结束,字符串a为abcd,换行符虽然没有输入到a里面,但它还在缓冲区,将作为下一次的输入第一个字符,于是第二个scanf输入字符串b时,由于直接输入了还在缓冲区的换行符,所以输入也结束,字符串b为空字符串。
第二个程序使用%*c,表示跳过了缓冲区的一个字符,就是那个换行符,于是达到我们的目的。当然如果把第一个scanf的换行符换为别的字符,效果应该会更明显,读者自行验证。
参考文章:scanf( )与正则表达式
C++ :std::cin
c++中cin的用法,参考C++中cin的详细用法,这里只给出针对acm输入cin的一些简单用法。
首先,cin>>data,遇到空格、tab、换行就停止输入,但是输入之前遇到这些空格、tab、换行,或缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。
所以如果输入的数据是以空格、换行分开,就直接cin>>就行了,如果数量未知,就用while循环
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int>data;
int temp;
while (cin>>temp){
data.push_back(temp);
}
for (int i = 0; i < data.size(); i++){
cout<<data[i]<<" ";
}
}
输入:
1 2 3 4
5 6 7 8
9
输出:
1 2 3 4 5 6 7 8 9
第二,就是cin.get()用法,如下
- cin.get(char类型变量) ;
- cin.get(char类型变量数组,最大读取数量);
- cin.get();用于舍弃输入流的不需要的字符(比如回车什么的)
C++ :getline
头文件<iostream>
简单用法,可以通过getline来获取一行字符,语法如下
std::string s;
getline(std::cin, s) //从输入流中读取一行赋给s。
getline(std::cin, s ,ch)//从输入流中读取内容,赋给s,直到遇到字符ch,返回结果。
举个栗子
std::string s1;
std::string s2;
char ch=',';
getline(std::cin,s1);
getline(std::cin,s2,ch);
std::cout<<s1<<std::endl<<s2<<std::endl;
输入:
a,2,b,5 wd hh
2b,LOL
输出:
a,2,b,5 wd hh
2b
我们看到第二行,getline遇到,就停止输入了,那么如果我们想要把拆分后的字符串都保存,怎么办呢?那就用循环。还是用栗子说话。
输入
输入
1,2,5,9,74,582,1124
存储的数据结构自己选择,我这里用vector,代码如下
#include<iostream>
#include<vector>
using namespace std;
int main(){
string s;
char ch=',';
vector<string>str(0);
while (getline(cin,s,ch)){
str.push_back(s);
}
for (int i = 0; i < str.size(); i++){
cout<<str[i]<<" ";
}
}
输出
1 2 5 9 74 582 1124
当然也可以用for循环,特别是如果知道了输入数量的,比如输入n行字符串,保存
输入:
3
I love China
I am chinese
I am not SB
#include<iostream>
#include<vector>
using namespace std;
int main(){
int num;
cin>>num;
cin.get();//之所以要cin.get(),是因为cin>>num之后有一个换行符,这个换行符残留在缓冲区了(前面cin有讲),getline不会忽略缓冲区的换行、空格等,所以要主动去掉
vector<string>str(num);
for (int i = 0; i < num; i++){
getline(cin,str[i],',');
}
for (int i = 0; i < str.size(); i++){
cout<<str[i]<<" ";
}
}
当然,getline还可以用作单独的字符串分割,用到stringstream输入流,这里给出实例代码
#include<sstream>
#include <iostream>
/*
@func 字符串分割
@para1 待分割长字符串
@para2 分割标志字符
@ret 分割后子字符串数组,不包含标志字符delim
*/
vector<string>stringSplit(const string str,char delim){
stringstream ss;
ss<<str;
string item;
vector<string>elems;
while (getline(ss,item,delim))
{
if(!item.empty()){
elems.push_back(item);
}
}
return elems;
}
C++基本上使用以上cin和getline方法就可以处理大部分输入了,灵活运用就行。
输出
输出指定小数点后位数
C语言:printf("%.nf",number);
C++ :cout
#include<iomanip>
cout<<setprecision(n)<<数字<<endl;
其他
类型转换
string to char*
str1.c_str();,然后使用strcpy复制字符串拼接
- string类型,直接相加 +
- 字符串(字符数组),可以用
strcat(str1,str2)// #include<string.h>
char* to number
atoi(char*) // #include <stdlib.h>intatof(char*)floatnumber to string
to_string(num); // #include <string>char* to string
char ach1[] = "Hello";
string str1(ach1);
string str2 = ach1;
练习
用我以上介绍的方法,(其实C++不需要用到scanf),以下练习应该是可以轻松解决的。
进行在线oj输入输出练习
C/C++中的ACM题目输入处理——简单易上手的更多相关文章
- 南阳ACM 题目811:变态最大值 Java版
变态最大值 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解决了 ...
- Scanner, BufferedReader, InputStreamReader 与ACM模式输入
Scanner, BufferedReader, InputStreamReader 与ACM模式输入html { -webkit-print-color-adjust: exact } * { bo ...
- python基础练习题(题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数)
day10 --------------------------------------------------------------- 实例017:字符串构成 题目 输入一行字符,分别统计出其中英 ...
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
- 面试大总结:Java搞定面试中的链表题目总结
package LinkedListSummary; import java.util.HashMap; import java.util.Stack; /** * http://blog.csdn. ...
- 面试大总结之二:Java搞定面试中的二叉树题目
package BinaryTreeSummary; import java.util.ArrayList; import java.util.Iterator; import java.util.L ...
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- (转)面试大总结之一:Java搞定面试中的链表题目
面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目, ...
- AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能
在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...
- python中的三种输入方式
python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...
随机推荐
- go web学习(四)
跟着b站https://space.bilibili.com/361469957 杨旭老师学习做的笔记 中间件 什么是中间件 请求----> 中间件 ----> Handler 响应 &l ...
- 解决github网站打不开
方法一(此方法无效则选 方法二) 发现github经常打不开无法访问,最近尝试了下改host发现效果挺好,方法如下(windows电脑): 进入站长工具网站的域名解析网址:http://tool.ch ...
- RTC+AI|“即智”数智人创新内容生产体验,为企业降本增效再提速
号称"史上最卷"的618年中大促落下帷幕,几大电商巨头在直播投入和短视频内容建设上持续加码,短视频+直播电商的营销模式成为618期间的主要输出. 以某美妆专场直播间为例,主播现场手 ...
- 基于Taro开发京东小程序小记
一.小程序基础模型 这里要从微信小程序的历史说起,从前身到现在大概分为3个阶段: 阶段1: 微信网页需要用到app的原生能力,微信官方推出了js-sdk 阶段2: 解决移动端白屏问题,采用微信web资 ...
- 一个Web项目实现多个数据库存储数据并相互切换
1.使用场景 多数据源使用场景一般为: 主从数据库切换 读写分离 兼容旧库 2.具体实现 实现原理 Spring2.x的版本中采用Proxy模式,就是在方案中实现一个虚拟的数据源,并且用它来封装数据源 ...
- CobaltStrike4.8--云服务器搭建
系统版本选用 选择最熟悉的版本,我这边用的CentOS7.8,选用乌班图的话,会有一些命令的不一致 配置运行环境 CobaltStrike4.0支持jdk1.8的环境,4.5开始就不支持1.8了,本文 ...
- CF1855B Longest Divisors Interval 题解
题意: 给定一个数 \(n\),求一个连续区间 \([l,r]\) 使得 \(n\) 是区间内每个数的倍数,最大化这个区间的长度(多组数据). 思路: 逆向思考一波,( 如果一个数 \(x\) 不是 ...
- Cilium系列-8-绕过 IPTables 连接跟踪
系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...
- VUE3、ElementPlus 重构若依vue2 表单构建功能
Vue3 + ElementPlus + Vite 重构 若依Vue2 表单构建功能 若依官方的Vue3 版本发布已经有段时间了,就是这个表单构建功能一直没有安排计划去适配到Vue3! 前段时间公司需 ...
- 【算法】用c#实现德州扑克卡牌游戏规则
德州扑克是一种牌类游戏,可多人参与,它的玩法是,玩家每人发两张底牌,桌面依次发5张公共牌,玩家用自己的两张底牌和5张公共牌自由组合,按大小决定胜负. 使用c#完成功能Hand()以返回手牌类型和按重要 ...