cin 输入空格符和 getline() 忽略开头换行符

1、输入空格符

getline() 函数实际上有三个参数,第三个参数指定字符串的结束符,也就是当 getline() 函数遇到这个字符时,就不再接受输入了。例如

getline(cin, str, 's');  

即使输入的是 abcsdef ,读入到 str 的内容却只有 abc ,因为遇到字符 ‘s’ 时,getline() 便停止读入了。

即输入 abcsabc 按回车键后,程序以 enter 作为输入完成的信号,getline()  函数开始读入缓冲区的内容,它将结束符 ‘s’ 前的部分读入到变量 str ,舍弃结束符 's' 及其后面的部分。


下面这段代码需要按两次回车键才能执行 cout 进行打印,则是因为 getline()  默认情况下以回车 ('/n') 作为结束符。第一次按回车时, getline() 将其作为读入的结束符,而非输入完成信号,第二次按回车才是输入完成的信号。

#include<iostream>  
#include<string>   
using namespace std;   
int main(){   
    string s;   
    getline(cin,s);   
    cout<<s;   
    return 0;   
}  

(本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lengyuhong/archive/2009/10/12/4659724.aspx)    


那么,当程序循环调用 getline(cin, s) 时,如果不做任何处理,每隔一次的开头输入都是上次的输入完成信号即 enter,由于 getline() 并不忽略行开头的换行符,只要 getline() 遇到换行符,哪怕是第一个字符,getline()  也会将它作为本次输入的字符串结束符,它将会把本次输入的内容舍弃,而将开头的 enter 之前的部分(为空字符)读入到目标变量 ,导致第二次调用时读入变量的是空字符。

可以使用小节 2 中给出的方法解决该问题。

2、使用 cin.clear() 或 cin.ignore() 跳过最开始的终止符。例如

#include<iostream>  
#include<string>
using namespace std; 
int main() { 
    char str[8]; 
    cin.getline(str, 5); 
    cout << str << endl; 

    cin.clear();       // 如果这里没有 clear,那么下面的输入就被忽略了,因为 cin 标志未清除 
    cin.getline(str, 5); 
    cout <<str <<endl; 

    system( "pause "); 
    return 0; 
} 

也可以用 cin.ignore(1)忽略一个字符cin.ignore(1024,'/n')在遇到换行后或者忽略了1024个字符后不再忽略


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值