一、前言  

  在C++程序的编写过程中,可能会经常用到cin方式用来捕获输入设备的输入信息。细分的话,主要的方式有:cin>>、cin.get、cin.getline。在借助键盘等字符输入设备进行输入的时候,如果键入Enter(\r)才会把目标字符输入到缓存区,,键入的'\r'会被转换成一个'\n',这个换行符同样也会被输入到缓存区,当做一个键入字符来处理。

  参考资料:https://blog.csdn.net/k346k346/article/details/48213811

二、测试环境

  Win10 + Visual Studio 2017 + Debug (x86)

三、cin>>方式

  可以从输入设备连续提取输入信息,其中,可以作为分格符使用的有Tab、空格(Space),换行符是用作结束符使用。

 #include "pch.h"
#include <iostream>
#include <string>
#include <vector> using namespace std; int main(void) {
string str;
while (cin >> str) {
cout << str << '\n' << endl;
}
return ;
}

  测试结果如下【输入:orange[Space]juice[Tab]orange[Enter]】。

 orange juice    orange
orange juice orange

  这种方式下的str,经过调试发现,并不会在最后出现截止符‘\0’。

  (1)、cin>> 等价于cin.operator>>(),调用成员函数operator>>()进行数据的读取;

  (2)、当cin>>方式从缓存区读取数据时,会自动忽略作为第一个字符存在的Tab、空格(Space)、换行,继续读取下一个字符,若缓存区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。

  个人觉得体验不好的一点:结束输入的时候,需要【Ctrl + Z】+ 【Enter】,连续两次的输入才能达到目的。【经过查询,有的网友认为是编译器的原因,这里还没有进行进一步的确定】

四、cin.get方式

  cin..get方式用来读取一个字符,包括空格【Space】。

  主要的实现方式有两种:cin.get、cin.get(para)。

 #include "pch.h"
#include <iostream>
#include <string>
#include <vector> using namespace std; int main(void) {
char a, b;
a = cin.get();
cin.get(b);
cout << a << b << endl;
system("pause");
return ;
}

 测试结果如下【输入:cv[Enter]】。

cv
cv
请按任意键继续. . .

  需要注意的是,cin.get()从输入缓存区读取单个字符时,并不会忽略分割符;cin.get()的返回值是int类型,成功读取的时候则返回字符的ASCII码值,遇到文件结束符时则返回EOF(-1)【Windows下的结束符:Ctrl + z;Linux下的结束符:Ctrl + d】;cin.get(para)在读取成功的时候返回的是cin对象,对此,我们可以进行链式操作,比如cin.get(a).get(b)。

  cin.get()方式用来读取一行的流数据,有两种方式:

  istream& get (char* s, streamsize n)【默认以换行符结束】;

  istream& get (char* s, size_t n, streamsize delin)【可指定结束符,n表示目标空间的大小】。

 #include "pch.h"
#include <iostream>
#include <string>
#include <vector> using namespace std; int main(void) {
     char a;
char array[] = { NULL }; cin.get(array, );
cin.get(a);
cout << array << ' '<< (int)a << endl; system("pause");
return ;
}

  结果1【输入:0123456789[Space][Enter]】。

  

  结果2【输入:012345678[Space][Enter]】

  

  结果3【输入:01234567[Space][Enter]】

   

  cin.get(array, 10)在进行数据读取时,遇到换行符结束,但是不对换行符进行处理。如果换行符之前数据个数超过9【包括[Space]】,则array读取的是前9个。对于换行符,cin.get(a)会对其进行相应的处理。

五、cin.getline方式

  cin.getline():从标准输入设备读取一串字符串,并以指定的结束符结束。

  相关的函数原型有:

  istream& getline(char* s, streamsize count)【默认以换行符结束】;

  istream& getline(char* s, streamsize count, char delim)【delim用以指定结束符】。

 #include "pch.h"
#include <iostream>
#include <string>
#include <vector> using namespace std; int main(void) {
char a;
char array[] = { NULL }; cin.getline(array, );
cout << array << endl; system("pause");
return ;
}

  测试结果1【输入:12345678978[Space][Enter]】。

 

  测试结果2【输入:12345678[Space][Enter]】。

 

  cin.getline()方式不会将结束符或者是换行符输入到缓存区中。

五、其他的一些方式

  1、getline

  getline:定义在namespace的全局函数,声明放在了<string>文件中。、

  getline利用cin可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:

  (1)、文件结束;

  (2)、行分割符的出现;

  (3)、输入达到最大限度。

  函数原型有两种:

  istream& getline ( istream& is, string& str);【默认以换行符\n分隔行】

  istream& getline ( istream& is, string& str, char delim)。

 #include "pch.h"
#include <iostream>
#include <string>
#include <vector> using namespace std; int main(void) {
string str; getline(cin, str); system("pause");
return ;
}

  测试结果【输入:Hello World![Enter]】

  cin.getline()的输出是char*,getline()的输出是string。cin.getline()属于istream流,getline()属于string流,有一定的区别。

  2、gets

  gets属于C语言的库函数,在<stdio.h>中申明。

  从标准输入设备读取字符串,可以无限读取,不会判断上限,以回车结束或者EOF时停止读取。在实际的应用过程中,应该确保缓存空间足够大,以防发生溢出。

  函数原型:char *gets( char *buffer )。

 #include "pch.h"
#include <iostream>
#include <string>
#include <vector> using namespace std;
int main(void) {
char array[] = { NULL }; gets_s(array); cout << array << endl; system("pause");
return ;
}

  测试结果【输入:Hello World![Enter]】

 Hello World!
Hello World!

六、总结

  还有一些细节了解的并不是很清楚,需要进一步的学习和实践。

  

C++ 中用cin方式获取输入的几种常用方式的更多相关文章

  1. 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式

    [方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1  BLOG文档结构图     2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学 ...

  2. sqlalchemy 转json 的几种常用方式

    sqlalchemy 转json 的几种常用方式 # -*- coding:utf-8 -*- import datetime from flask import Flask, json, jsoni ...

  3. iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤

    1.前言 上次,在博客里谈谈了[GET & POST]的区别,这次准备主要是分享一下自己对[GET & POST]的理解和实现的主要步骤. 在这就不多废话了,直接进主题,有什么不足的欢 ...

  4. iOS- 网络请求的两种常用方式【GET & POST】的区别

    GET和POST 网络请求的两种常用方式的实现[GET & POST] –GET的语义是获取指定URL上的资源 –将数据按照variable=value的形式,添加到action所指向的URL ...

  5. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  6. Postman几种常用方式

    Postman几种常用方式 1.get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到U ...

  7. ASP.Net Post方式获取数据流的一种简单写法

    public static string PostWebReq(string PostUrl, string ParamData, Encoding DataEncode)        {      ...

  8. linux下文件共享的几种常用方式

    1. python方式,做一个简单的服务器.默认是开启8000端口. > python -m SimpleHTTPServer 执行命令后,在浏览器上输入该机器IP+8000端口即可 2. sc ...

  9. Java中常用到的文件操作那些事(二)——使用POI解析Excel的两种常用方式对比

    最近生产环境有个老项目一直内存报警,不时的还出现内存泄漏,导致需要重启服务器,已经严重影响正常服务了.获取生成dump文件后,使用MAT工具进行分析,发现是其中有个Excel文件上传功能时,经常会导致 ...

随机推荐

  1. 响应式编程系列(一):什么是响应式编程?reactor入门

    响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响 ...

  2. Android Stdio 无法打开模拟器

    安装好了各种版本的AVD,有个版本4.1,API版本16,219MB的模拟器是可以打开的,但是基本不能用,只能看到首界面,跳转什么的完全不行. 除此之外其它高版本的模拟器都不能用(API版本>2 ...

  3. raft共识算法

    raft共识算法 分布式一致性问题 如果说,服务器只有一个节点,那么,要保证一致性,没有任何问题,因为所有读写都在一个节点上发生.那如果server端有2个.3个甚至更多节点,要怎么达成一致性呢?下面 ...

  4. java算法01 - 链表

    1.链表 在Java中实现链表,每个节点都有一个值,然后把它链接到下一个节点.下面来看一下节点的实现 class Node<E> { private E e; private Node&l ...

  5. Tomcat基本配置

    第二十六课 Tomcat基本配置 目录 一. Tomcat介绍 二. 安装jdk 三. 安装Tomcat 四. 配置Tomcat监听80端口 五. 配置Tomcat虚拟主机 六. Tomcat日志 七 ...

  6. Python参数笔记

    Python参数 1. 普通参数 必须要传入和定义时个数相同的参数 def miao(acfun, bilibili): print(acfun, bilibili) miao(11, 22) > ...

  7. linux下安装FTP详细

    一:安装ftp 1.检查是否安装了 ftp :(下图是已安装的效果,没安装没有展示) rpm -qa|grep vsftpd 2.安装指令:(找一个  -y  指令) yum install -y v ...

  8. Web服务器软件 (Tomcat)

    1.什么是服务器? 安装了服务器的软件的计算机 服务器软件:接收用户的请求(request),处理请求,做出响应. Web服务器软件:接收用户的请求(request),处理请求,做出响应,再Web服务 ...

  9. 分频器的Verilog实现

    一.占空比50%的奇数分频 1.实现思路 实现奇数(N)分频,分别用上升沿计数到(N-1)/2,再计数到N-1:用下降沿计数到(N-1)/2,再计数到N-1,得到两个波形,然后把它们相或即可得到N分频 ...

  10. sql注入1

    一.函数 1.version() MYsql版本 2.user()    数据库用户名 3.database()   数据库名 4.@@datadir  数据库路径 5.@@version_compi ...