C++中getline()与get()的应用区别详解

1、通常仅仅使用cin去读取用户输入的字符串会有一个问题:

    问题:就是输入字符串中有空格,只输出空格之前的字符,之后的字符会存在输入队列中,留给下一次cin输入使用。这就导致下一次cin时,用户不能主动输入就给被动完成了输入。如下例子所示:输入123 45,直接输出123;后面的45留在系统的输入队列中,如果下面紧接着加上一行输入代码,那么45会直接被输出,我们还没来得就反应,就被动输出了。不行可以试试。

 // 输入一行字符串
	char str[20];
	cout << "输入一行字符串:";
    // 这样输入是存在问题的,
    // 就是输入字符串有空格,只输出空格之前的字符,之后的字符在输入队列中,留给下一次输入变量。
	cin >> str;  
	cout << str << endl;

 // 运行结果如下:
 // 输入第一行字符串:123 45
 // 123
 // 请按任意键继续. . .

     我测试了一下,代码如下,输入123 45后,系统不久输出123,而且还自动输出45,我们没有第二次输入的机会。

	char str[20];
	char tmp[20];
	cout << "输入一行字符串:";
    // 这样输入是存在问题的,
    // 就是输入字符串有空格,只输出空格之前的字符,之后的字符在输入队列中,留给下一次输入变量。
	cin >> str;
	cout << str << endl;
	cin >> tmp;
	cout << tmp << endl;
 
//运行结果如下:
//输入一行字符串:123 45
//123
//45
//请按任意键继续. . .

    解决方法:使用getline() or get()

    下面使用getline(),getline不会在输入队列中保留输入的换行符,完美避免换行符对下一次输入的影响。

    输入123 45后,直接原样输出123 45。说明getline的确奏效哦。

   // 通过getline函数(get也行,只是保留换行符在输入队列中)解决含有空格输入的字符串情况
	char str[20];
	cout << "输入一行字符串:";
	cin.getline(str, 20);
	cout << str << endl;
 
  //运行结果如下:
 // 输入第一行字符串:123 45
 // 123 45
 // 请按任意键继续. . .

    使用get()方法:通过get输入还会存在换行符保留在输入队列中,避免这种情况,需要使用get()函数无参版本,即cin.get(); 可以直接读取下一个用户输入的字符,不会使用之前存储在输入队列中的换行符。

    下面是未使用get()函数无参版本,换行符对第二次输入影响很明显,直接空字符串输出。  

	char str[20];
	char tmp[20];
	cout << "输入第一行字符串:";
	cin.get(str, 20);
	cout << str << endl;
	cout << "输入第二行字符串:";
     // 还没开始手动输入,就直接输出换行符了,是因为上次输入保留了换行符在输入队列中导致的。
	cin.get(tmp, 20); 
	cout << tmp << endl;
// 运行结果如下:
// 输入第一行字符串:12345
// 12345
// 输入第二行字符串:
// 请按任意键继续. . .

    下面使用了get()函数无参版本,可以有效避免换行符的影响,用户可以二次手动输出字符串了。

char str[20];
	char tmp[20];
	cout << "输入第一行字符串:";
	cin.get(str, 20);
	cout << str << endl;
	cin.get(); //跳过换行符,要准备读取下一个字符。
     // 或者可以直接 cin.get(str, 20).get();
	cout << "输入第二行字符串:";
     // 可以手动输入了。
	cin.get(tmp, 20);
	cout << tmp << endl;
// 运行结果如下:
// 输入第一行字符串:12345
// 12345
// 输入第二行字符串:67890
// 67890
// 请按任意键继续. . .

 

2、混合输入数字与字符串情况:

    在输入数字后,cin将回车换行符留在输入队列中了,下一次还没输入字符串就直接被当成空串输出了。
    解决办法在后面加上get()无参版本, 就可以直接读取下一个数据。

// 问题演示
	int a;
	char str[20];
	cout << "输入数字:";
	// 在输入数字后,cin将回车换行符留在输入队列中了,下一次还没输入字符串就直接被当成空串输出了。
	// 解决办法在后面加上get(),直接读取下一个数据。
	cin >> a;  
	cout << a << endl;
	cout << "输入字符串:";
	cin.get(str, 20);
	cout << str << endl;
//运行结果如下:
//输入数字:12
//12
//输入字符串:
//请按任意键继续. . .

 

// 解决方案
	int a;
	char str[20];
	cout << "输入数字:";
	// 在输入数字后,cin将回车换行符留在输入队列中了,下一次还没输入字符串就直接被当成空串输出了。
	// 解决办法在后面加上get(),直接读取下一个数据。
	cin >> a;  
	cout << a << endl;
	cin.get();   // or (cin >> a).get();  or  (cin >> a).get(ch);  ch为char类型变量
	cout << "输入字符串:";
	cin.get(str, 20);
	cout << str << endl;
//运行结果如下:
//输入数字:12
//12
//输入字符串:string
//string
//请按任意键继续. . .

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值