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

来源:互联网 发布:淘宝月销量怎么看 编辑:程序博客网 时间:2024/06/05 00:08

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个字符后不再忽略


原创粉丝点击