专栏首页软件开发 -- 分享 互助 成长C++ 中字符串标准输入的学习及实验

C++ 中字符串标准输入的学习及实验

声明:下面实验中[]里面表示要输入里面的符号,[]符号本身并未输入

1、cin>>

cin使用空白(空格、制表符、回车)来确定字符串的结束位置。

cin会将换行符留在输入输出队列中。

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char p[100];
 7     char q[100];
 8     cin>>p;
 9     cout<<p;
10     cin>>q;
11     cout<<q;
12     return 0;
13 }

实验:上述程序中输入:good [空格或者tab] job [回车],然后似乎还没等输入第二个字符串q的值,就已经输出了good job 原因:cin>>把good作为第一个字符串赋值给p,然后job被留在了输入队列中,当执行到cin>>q的时候,发现队列里已经有job了,就直接将job赋值给q,然后执行cout<<q。

2、面向行的输入cin.get()、cin.getline()

这两个函数都是cin的成员函数,功能都是读取一行,遇到换行符(回车)认为是字符串的结尾,不同的是getline()将换行符从输入队列中丢弃,而get()会将换行符保留到队列中。

(1)cin.get()

原型:

cin.get(char *str,int ArSzie, char delim)
cin.get(char *str,int ArSzie)
cin.get(void)
cin.get(char)

读字符串的时候用的是前两个原型,而第三个原型可以读取任何字符(包括换行符)

参数说明:str读取字符串所放置的位置,ArSize要读取字符串的最大长度,如ArSize为5的时候,则strlen(str)最大只能为4,因为最后一个要放'\0',delim停止符,如果不设置,则默认为换行符

功能:读取一行字符串到str中,然后将遇到的停止符留在输入队列中。

程序1

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char p[100];
 7     char q[100];
 8     cin.get(p,5);
 9     cout<<p<<endl;
10     return 0;
11 }

输入abcde  输出abcd 。原因:cin.get(p,5)说明p的最大空间长度是5(包括'\0'),所以p里面读取到了abcd'\0'

程序2

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char p[100];
 7     char q[100];
 8     cin.get(p,5,'#');
 9     cout<<p<<endl;
10     return 0;
11 }

输入ab#c,输出ab 程序3

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char p[100];
 7     char q[100];
 8     cin.get(p,5);
 9     cout<<p<<endl;
10     cin.get(q,5);
11     cout<<q<<endl;
12     return 0;
13 }

输入abc回车,输出abc,然后直接两个空白行,结束,没给机会输入q,原因是cin.get(p,5)遇到换行符的时候并没有将换行符从输入队列中丢弃,然后cin.get(q,5)的时候,上来就碰到换行符以为输入结束,所以q值为空 解决办法,cin.get(p,5),用cin.get()将换行符从输入队列中读走,如程序4

程序4

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char p[100];
 7     char q[100];
 8     cin.get(p,5);
 9     cin.get();
10     cout<<p<<endl;
11     cin.get(q,5);
12     cout<<q<<endl;
13     return 0;
14 }

这回p、q都有机会正确的输入输出了

(2)cin.getline()

原型:

cin.getline(char *str,int ArSzie, char delim) cin.getline(char *str,int ArSzie)

参数说明:str读取字符串所放置的位置,ArSize要读取字符串的最大长度,如ArSize为5的时候,则strlen(str)最大只能为4,因为最后一个要放'\0',delim停止符,如果不设置,则默认为换行符

功能:读取一行字符串到str中,然后将遇到的停止符从队列里剔除。

前三个函数和cin.get()的结果一样所以就不再写了,下面直接写一个与cin.get()的程序4想对应的程序,进行对比

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char p[100];
 7     char q[100];
 8     cin.getline(p,5);
 9     cout<<p<<endl;
10     cin.getline(q,5);
11     cout<<q<<endl;
12     return 0;
13 }

该程序中p、q都能正常输入输出,原因对比cin.getline和cin.get的功能即可

3、getline()   

使用时要#include<string> 

原型:

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

istream& getline ( istream& , string& );

参数:

is 进行读入操作的输入流

str 存储读入的内容

delim 终结符

返回值: 参数is是一样的

功能:

将输入流is中读到的字符存入str中,直到遇到终结符delim才结束。对于第一个函数delim是可以由用户自己定义的终结符;对于第二个函数delim默认为 '\n'(换行符)。函数在输入流is中遇到文件结束符(EOF)或者在读入字符的过程中遇到错误都会结束。在遇到终结符delim后,delim会被丢弃,不存入str中。在下次读入操作时,将在delim的下个字符开始读入。

getline()和cin.getline()区别:

(1)cin.getline()属于istream流,而getline()属于string流,所以使用getline()的时候要包含头文件string

(2)原型不一样,特别注意字符串的参数类型cin.getline()中字符串是char *,它可以将字符串读入到char *型的字符串,也可以将字符串读入到string类型的字符串中,getline()原型中的字符串时string类型,所以只能读入到string类型的字符串中,不可以读入到char *类型中

(3)输入的时候cin.getline限定了输入的最大字节数,而getline没有限制,其实本质原因还是因为原型不一样

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 享元模式

    一、简介 1、享元模式运用共享技术有效地支持大量细粒度的对象。 2、享元模式是为了减少同种类的实例化,以达到节省内存的目的。 3、类成员函数 抽象享元类(Fly...

    用户1215536
  • 浅谈保证软件工程质量的一些心得体会

    Itwolf原创博客,转载请标明出处,谢谢

    用户1215536
  • 浅谈保证软件工程质量的一些心得体会

    前言: 质量这个词究竟有多重要,没有切身体会真的很难说的出来,从毕业到进入华为工作马上就要满1.5年了,现在这个词理解更加深刻了些。这么说吧,质量在华为的研发领...

    用户1215536
  • CSS,注意点!!!!!!!

    4、用css给body标签加个 margin:0(用于消除body边框和浏览器间的空白部分)

    Wyc
  • 打印1到最大的n位数

    这道题是面试过可能会遇到的手写代码题。如n为3时,那么需要打印1到999。需要注意的是当输入的n很大时,最大的n位数是不能通过int或者long long in...

    Dabelv
  • CSS 3.0实现瀑布流布局

    瀑布流布局是网页中常见的布局效果,一般我们都是用JS实现的,其实用CSS 3.0的属性也可以实现这个功能,并且还自带了响应式功能,效果如下 :

    越陌度阡
  • vue render jsx 事件绑定 条件渲染 slots 插槽

    yangdongnan
  • Thymeleaf使用笔记

    模板引擎是为了使用户界面与业务数据内容分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档。当项目里面配合后端框架spring bo...

    王小婷
  • 自适应表头和左侧列固定的表格

    在网站建设中,表格的出现提供了数据对比的便利以及数据查看的便利。但是当表格数据过多时,在同一个屏幕下无法完全展示,出现滚动条后,表头部分就被盖住,很容易不清楚看...

    无邪Z
  • 解读mpvue官方文档的Class 与 Style 绑定及不支持语法

    在vue.js项目转化为小程序时,把原来页面的代码直接拷贝过去,发现布局改变很多,很多已经设置的标签的css样式并没有显示出来,查看官方文档,得知原来vue.j...

    honey缘木鱼

扫码关注云+社区

领取腾讯云代金券