C++面向行输入:get()与getline()

Posted Quirkygbl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面向行输入:get()与getline()相关的知识,希望对你有一定的参考价值。

面向行的输入:get()与getline()

引入:

char a = \'s\';//这样的语句合法
char b = "s";//不合法
/*
"S"不是字符常量,他表示两个字符(S和\\0)组成的字符串。
并且"S"表示的的是字符串所在的内存地址,相当于将一个内存地址赋给b
*/

cin使用空格、制表符、换行符来确定字符串的结束位置,这意味着cin在获取字符数组时只读取一个单词。读取该单词后,cin将该字符串放到该数组中,并自动在结尾添加空字符。

e.g.

char a[30];
char b[30];
cin>>a;
cin>>b;

当你输入

word1 word2

并敲下回车,cin>>a在word1后检测到空格结束

但程序不会再提示你要输入b

程序把word2留在输入队列中,当cin在输入队列中搜索时,发现了word2,cin读取word2并将它放在b数组中

getline()

  • 读取整行
  • 通过回车键输入的换行符来确定输入结尾
  • 可以使用cin.getline() 该函数有两个参数,第一个参数是用来储存输入行的数组名称,第二个参数是要读取的字符数(如果这个数是20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符)。
  • getline()成员函数在读取指定数目的字符或遇到换行符时停止读取
  • !每次读取一行,通过换行符来确定行尾,但不保存换行符,相反,在存储字符串时,用空字符来替换换行符!

get()

  • 读取整行(同getline())

  • 通过回车键输入的换行符来确定输入结尾(同getline())

  • 可以使用cin.get() 与getline()函数接收的参数相同,解释参数的方式也相同。并且都读取到行尾

  • !但是,get不再读取并丢弃换行符,而是将其留在输入队列中!

    • 解决方法:

      • 可以用不带参数的get()函数来处理换行符
      cin.get(name,ArSize);
      cin.get();
      cin.get(dessert,ArSize);
      
      • 将两个类成员拼接起来
      cin.get(name,ArSize).get();
      

      ​ 可以这样操作是因为cin.get(name,ArSize)返回一个cin对象,该对象随后被用来调用get()函数

      • 同样,可以把输入中连续的两行分别读入两个数组中
      cin.getline(name1,ArSize).getline(name2,ArSize);
      

差异

  1. 为什么有时候用get而不用getline呢?

    老式实现没有getline(),其次get()使输入更仔细

    getline()使用起来简单一些,但get()使得检查错误更简单些

  2. 如何判断get是因为读取了整行而停止还是因为数组已填满?

    查看下一个字符,如果是换行符,说明已读取了整行输入,否则,该行中还有其他输入

可能出现问题

  1. 空行

    这两种函数的下一条输入语句将在上一次结束读取的位置开始读取

    get()读取空行后设置失效位时,意味着接下来的输入将被阻断,但可以用cin.clear()命令来恢复输入

  2. 输入的字符串可能比分配的空间长

    如果输入行包含的比指定的多,则两种函数会把余下的字符留在输入队列中,而getline()还会设置失效位,并关闭后面的输入

  3. 混合输入数字和字符串导致的问题

    cin输入一个数字类型,按下回车时,换行符留在了输入队列,下一次被getline()等看到换行符,将认为是一个空行,直接赋给数组

    解决方法是读取地址之前丢弃换行符

    可以用(cin>>year).get()或者cin>>year;get();

C++的面向行的输入:getline()与get()

C++的面向行的输入:getline()与get()

1.getline()

通过回车键输入的换行符来确定输入结尾。

要调用这种方法,可以使用cin.getline()。

该函数有两个参数:第一个参数是用来存储输入行的数组的名称,第二个是要读取的字符数。

若此参数为20,则只能读取19个字符。余下空间将用于存储自动在结尾添加的空字符。

cin.getline(name,20);

getline成员函数在读取的指定数目的字符或者遇到换行符的时候停止。

2.get()

get()函数有多种变体,之一就是和getline相似,读取参数,工作方式相同,但是此时换行符会停留在输入的队列中。

此时可以借助get函数的变体来处理剩余的换行符,即直接读入。

此时有一下几种用法。

cin.get(name,ArSize);
cin.get();

//或者

cin.get(name,ArSize).get();

为什么使用get而不用getline呢?

使用get()可以清楚区分是否读取了一整行而不是数组已经被填满。就是看下一个字符是否为换行符。

3.空行和其它问题

当getline或者get读取空行时,之前是在上一条结束读取的位置开始读取。但是当前的做法是:(仅限get)此时将设置失效位,使用cin.clear()来恢复输入命令。

以上是关于C++面向行输入:get()与getline()的主要内容,如果未能解决你的问题,请参考以下文章

C++面向行输入:get()与getline()

3c++的getline与get

C++学习之旅getgetline的用法

C++基础:各种输入方法总结,cincin.get()cin.getline()getline()gets()getchar()

cin, getline() 与 get() 的区别

C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数