c++面向行的输入getline()和get()

来源:c++ primer plus

在c++里当我们输入一个字符串时习惯用cin,但是cin只能读取一段不含空格的字符串,如果我们需要读取一段包含空格的字符串时,就需要用到getline()或get()。下面介绍getline()和get(),这两个都是读取到换行符结束。

1.getline():

假设现在我们要输入一个名字,保存在name数组里:

#include<iostream>
using namespace std;
int main()
{
  char name[10];
  cin.getline(name,10);
  cout<<name<<endl;
  return 0;
}
//第一次输入:123456    第一次输出:123456
//第二次输入:1234567890 第二次输出:123456789

调用方式是cin.getline(),里面有两个参数,分别是数组名和数组长度,在这里要注意的是如果长度是10,那么最多只会读取9个字符,因为还有一个位置要留给空字符'',如果只输入5个,那么剩余的都会用空字符来补满。对于getline(),它一直读取到遇到换行符或到达指定数目字符时结束,然后换行符会被丢弃,不留在输入队列里(这是接下来它和get()的细微区别)。

getline()也可以这样用:

#include<iostream>
using namespace std;
int main()
{
    char name1[10],name2[10];
    cin.getline(name1,10).getline(name2,10);
  //第一次调用返回一个cin对象,然后这个对象再调用getline() cout
<<name1<<' '<<name2<<endl; return 0; } /*输入: 123 456 输出:123 456 */

2.get():

get()和getline()很像,也是两个参数,但是get()读取到换行符停止时,换行符会留在输入队列里,下一次读取时就会再次读取到换行符,导致读取为空。

例如:

#include<iostream>
using namespace std;
int main()
{
    char name1[10],name2[10];
    cin.get(name1,10);
    cin.get(name2,10);
    cout<<name1<<' '<<name2<<endl;
    return 0;
}
/*输入:123
输出:123 */

在这里我是想输入123再输入456的,但是我没机会了,因为输入123时遇到换行符然后停止,第二次调用时这个换行符还在输入队列里,程序就会再次停止,后面就读取不到内容了。

当cin.get()里面没用参数时,它会吸取一个字符,包括换行符,所以我们可以这样:

#include<iostream>
using namespace std;
int main()
{
    char name1[10],name2[10];
    cin.get(name1,10);
    cin.get();
    cin.get(name2,10);
    cout<<name1<<' '<<name2<<endl;
    return 0;
}
/*输入:
123
456
输出:
123 456  
*/

也可以这样写:

#include<iostream>
using namespace std;
int main()
{
    char name1[10],name2[10];
    cin.get(name1,10).get();
    cin.get(name2,10);
    cout<<name1<<' '<<name2<<endl;
    return 0;
}
/*输入:
123
456
输出:
123 456  
*/

 空行和超出分配空间都会导致出错,应该尽量避免。

还有就是当我们在实际运用中可能要数字和字符串混合输入,这个时候容易出错,举一个书上的例子:

#include<iostream>
using namespace std;
int main()
{
    int year;
    char address[20];
    cin>>year;
    cin.getline(address,20);
    cout<<year<<endl;
    cout<<address<<endl;
    return 0;
}
/*
输入输出: 
2018
2018

*/

我们输入了年份,这个时候换行符还在输入队列里,然后调用getline()时遇到换行符,直接结束读取。。。,这里可以用cin.get()来吸收换行符。

差不多就这么多吧。

原文地址:https://www.cnblogs.com/6262369sss/p/9385839.html