首页 > 编程语言 >[C++学习笔记-IO控制_2]:控制台IO-cin 输入

[C++学习笔记-IO控制_2]:控制台IO-cin 输入

时间:2022-11-21 23:12:58浏览次数:42  
标签:字符 get int cin C++ char IO 输入

目录

控制台 I/O: cin 输入

image

1. 重载的>>运算符

重载的>>运算符使得cin能识别所有的基本类型,同时也支持char*型来提供字符串数据的输入,可以使用:

cin >> dec; //hex/oct 来指定输入的数据是什么进制的

对于输入数据,还可以指定进制来决定输入的数据:

int x;
cin >> hex >> x;

2. cin 的特点

cin会跳过空白(空格,制表符和换行),直到遇到非空白字符,然后在遇到下个空白或者与目标类型不匹配的第一个字符为止。如以下代码:

int x, y;
cin >> x >> y;
cout << "x=" << x <<",y=" << y << endl;

对于以下输入有:

//输入1
    3 4 //结果为x=3,y=4,因为会跳过最开始的空白,如果想接收空白的话,要用cin.get()
//输入2
3a 4 //结果为x=3,y=0

对于第二个输入,因为字符a不符合int,所以x到这里就停止了,但是a还在输入缓冲中,y去取数据的时候发现第一个值为a,不符合其数据类型,但直接返回 0。

3. 其他输入方法

3.1 单字符输入: get()

如果不想忽略空白的话,可以用cin.get(),它有两种形式,get()get(char &ch)都接收空白输入,get()函数读取下一个输入字符,并将该字符转换为整型后返回;get(char &ch)将输入字符赋给其参数,返回的是一个指向调用它的istream对象的引用,这意味着get(char &)接受拼接输入:

char c1, c2, c3;
cin.get(c1).get(c2) >> c3; //c1,c2不跳过空白,c3会跳过空白

对于get()方法的话,如果到达了文件尾,则会返回常量 EOF(在文件<iostream>中定义),所以对于它的话,循环读取的写法如下:

while (cin.get() != EOF) {}

对于get(char&)的话,如果到达了文件尾,get(char &)会自己调用setstate(failbit)导致cin的结果为false

char ch;
while (cin.get(ch)) { //如果到达文件尾的话,会返回false
    cout << ch;
}

3.2 字符串输入: get()/getline()

字符串输入方式有以下几种,但是要注意,下面的方法都会影响文件偏移量:

istream & get(char *, int, char);
istream & get(char *, int);
istream & getline(char *, int, char);
istream & getline(char *, int);

第一个参数用于存储输入的字符串,第二个参数需要比要读取的最大字符数 + 1(额外的一个字符用于存储结尾的空字符,以便将输入存储为一个字符串),第三个参数用于指定分界符。两个参数的版本的话就将换行符用作分界符,有分界符的版本会在遇到分界符后就停止输入,即使还没到读取的最大数目上述函数都在读取最大数目的字符或遇到换行符后为止。

get()getline()的主要区别在于,get()将换行符留在输入流中,这样接下来的输入操作首先看到的是换行符,而getline()的话会丢弃输入流中的换行符。

还有个忽略函数ignore(),原型为:

istream & ignore(int i = 1, int = EOF);

第一个参数是要读取的最大字符,第二个参数指定了分界符,这个函数会读取指定的字符数或到达了分界符,然后把读到的数据丢掉。

3.3 其他的输入函数

read函数可以读取指定数目的字节,并将它们存储在指定的位置中:

char temp[21];
cin.read(temp, 21);

getgetline不同的是,read不会在输入后自动加上空字符,因此不能将输入转换为字符串,它常与ostream write()函数结合使用,来完成文件输入和输出。

peek函数返回输入中的下一个字符,但不抽取输入流中的字符,也就是一个看看的函数。

char temp[50];
char ch;
int i = 0;
while ( (ch = cin.peek() != '.') && ch != '\n') { //如果下一个字符不是句点或者换行符,则读取该字符并保存至temp中
    cin.get(temp[i++]);
}
temp[i] = '\0';

gcount函数返回最后一个非格式化抽取方法(也就是不是cin,像get这类)读取的字符数,但其实也可以用strlen函数来计算输入得到的字符数,这种方法比使用cin.gcount更快。

putback方法将一个字符插入到输入字符串中,被插入的字符将是下一条输入语句读取的一个字符。

标签:字符,get,int,cin,C++,char,IO,输入
From: https://www.cnblogs.com/sleep-at-11/p/16913747.html

相关文章

  • 性能调优 session 1 - 计算机体系结构 量化研究方法
    近期本人参与的存储系统项目进入到性能调优阶段,当前系统的性能指标离项目预期目标还有较大差距。本人一直奉行"理论指导下的实践",反对凭感觉调试。尤其在调试初期,更要抓住......
  • C/C++数据结构题目(2022)
    C/C++数据结构题目(2022)1、菜鸟智慧系统(线性表)[问题描述]使用双向链表模拟快递驿站的系统运作:假设快递驿站的货架分小、中、大3种类型,容量分别为500、100、50个包裹;......
  • Playlist for Polycarp (hard version)
    本题显然只需要知道\(typ=1/2/3\)的歌的数量分别为什么就可以求出答案了。先随便求一下\(f_{i,j,k}\)表示取\(i\)个\(1\),\(j\)个\(2\),\(k\)个\(3\)的贡献......
  • vue+axios+ssm解决跨域问题
    环境1.vue-admin-template模板2.axios3.后端java跨域问题解决方案注意:配置了前端解决方案后端可以不用配置,反之后端配置了前端可以不用配置前端解决方案前端采用......
  • C/C++员工通讯录(链表实现)
    C/C++员工通讯录(链表实现)一、设计一个员工通讯录(如编号、身份证号码、姓名等),用单链表实现员工通讯录的存储和增删改查等操作。通讯录链表的建立;通讯者信息的插入;通讯......
  • C/C++校运动会成绩管理系统
    C/C++校运动会成绩管理系统该系统可以记录校运动会全部运动项目的成绩、得分和排名情况,系统功能项以菜单形式显示。项目包括50米、100米、200米、400米、1500米、各接力项......
  • JsonSerializerOptions 时间带T处理
    ///<summary>///对象转JSON///</summary>///<paramname="obj">对象</param>///<returns>JSON格式的字符串</ret......
  • C/C++文件压缩与解压(哈夫曼编码)
    C/C++文件压缩与解压(哈夫曼编码)实验四:文件压缩与解压一、实验目的:掌握哈夫曼编码和解码二、实验内容:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降......
  • idea使用oracle数据库报错《java.sql.SQLRecoverableException: IO 错误: Undefined E
    错误描述java.lang.RuntimeException:java.sql.SQLRecoverableException:IO错误:UndefinedError atcom.baomidou.mybatisplus.generator.config.DataSourceConfig.......
  • C/C++仓库管理系统
    C/C++仓库管理系统四、仓库管理系统问题描述:1.问题描述:已知一工厂有5个仓库(仓库编号、仓库规格),用于保存公司生产的10类产品(产品编号、产品名称、产品规格),任何--......