C++ 的getline问题
在用c++的getline函数的时候碰到两个问题,总结如下:
1.有时候写程序的时候我们会发现getline(cin,str);这样的语句是不会执行,而是直接跳过的,    
一般的解决方法是getline一句之前加cin.ignore()或者一句cin.get();,或者重复geiline
解释:
认真检查,在你写getline()函数之前,一定有输入过回车键,不论你输入的是字符,数字或是回车,空格符,getline()函数都接收   
而cin>>这种输入方式却是忽略回车的,如果你在getline()之前cin的一个数,回车被cin忽略了,却被getline函数接收了,感觉就是这条语句被跳过了 所以解决的办法是在getline函数之前再使用getline一次,将输入流里的回车符接收掉,后面就能正常输入了
比如这段代码   
int a        
cout<<"请输入a"<<endl;    
cin>>a;    
char *ch;    
a=new char[a];    
cout<<"请输入字符串ch"<<endl;    
cin.getline(ch,100);
你会发现cin.getline(ch,100);并没有执行,因为cin>>a;后,你有一个回车键停留在缓冲区中了,当使用cin.getline(a,100);读到这个回车符,就认为输入结束了,所以,看起来没有起作用。   
应该是    
cin>>a;    
cin.get();   //加上这一句。
2.while(getline(cin,line))怎么也跳不出循环
在C++premer中,标准string类型第二小节就是“用getline读取整行文本”。书上给的程序如下:   
int main()    
{    
    string line:    
    while(getline(cin,line))    
    cout<<line<<endl;    
    return 0;    
}    
大家会发现运行时怎么也跳不出循环,
让我们一起来分析一下while(getline(cin,line))语句
注意这里默认回车符停止读入,按Ctrl+Z或键入EOF回车即可退出循环。
在这个语句中,首先getline从标准输入设备上读入字符,然后返回给输入流cin,注意看原型,返回类型是istream,在这个语句中对应的即是cin了,所以while判断语句的真实判断对象是cin,也就是判断当前是否有有效的输入流。在这种情况下,我想只要你的电脑不中毒不发神经你的输入流怎么会没有效?所以这种情况下不管你怎么输入都跳不出循环,因为你的输入流有效,跳不出循环。   
然而有些同学误以为while判断语句的判断对象是line(也就是line是否为空),然后想通过直接回车(即输入一个空的line)跳出循环,却发现怎么也跳不出循环。这是因为你的回车只会终止getline()函数的读入操作。getline()函数终止后又进行while()判断(即判断输入流是否有效,你的输入流当然有效,满足条件),所以又运行getline()函数。就这样一次一次又一次的循环了~~~
C++ 的getline问题的更多相关文章
- getline数据来源你的三种方式
		
(1)getline从交互式的用户输入中\c中获取内容: # awk 'BEGIN {system("echo \"Input your name:\"");g ...
 - awk中的system和getline的用法
		
system只能对命令的输出结果输出到终端. getline在awk中可以使命令的输出结果传到一个变量中保存. # awk 'BEGIN{system("date")|getlin ...
 - antlr.collections.AST.getLine()I异常
		
antlr.collections.AST.getLine()I异常 Struts+hibernate+spring项目经常遇到问题 因为Struts自带的antlr-2.7.2.jar,比H ...
 - 记一次程序排错与std::getline
		
今天忙活了半个下午,查找正式环境上面一个程序的问题.这个程序的作用是监控文件夹,处理每一个文件,分析每个文件的每行记录,然后将这个文件拆分成两个结果文件投放到另外两个不同的目录下面去,当处理完这个文件 ...
 - 用流来读取文件(getline,istringstream)
		
ifstream infile("fileanme"); 原型:getline(istream &infile, string &line); 函数说明:读取文件中 ...
 - cin, cin.getline等函数
		
char s[100]; cin>>s; // 输入一个字符串,遇“空格”.“TAB”.“回车”都结束 cin.getline(s, 20); // cin.get( ...
 - getline函数彻底说明
		
因为之前每次使用这个函数都要在网上查一遍,觉得很麻烦,这次就认真地整理一下,希望写完之后就记住. getline函数其实有两个: 一个是全局函数,include<cstring>, 原型是 ...
 - getline()函数
		
这是一篇关于getline()函数的博客,以总结对输入输出流的掌握,不再在这些问题上栽跟头~ -------------------------- 1.首先我们知道,getline()函数的基本作用, ...
 - C++IO关于cin>>和getline的理解
		
这个问题困扰了我有一段时间了,趁着十一放假有时间,仔细研究了一下 首先来看一下输入输出运算符cin>>的构成:cin和>> cin>>是由两部分构成的,cin和&g ...
 - getline函数的用法
		
函数声明 bool getline(istream &in, string &s) 功能说明: 从输入流读入一行到变量string s,及时是空格也可以读入. –直到出现以下情况为止: ...
 
随机推荐
- centos7环境下mysql安装
			
1.去官网下载合适的yum源安装包 https://dev.mysql.com/downloads/repo/yum/ 2.yum 本地安装 命令:yum localinstall mysql57-c ...
 - String、StringBuilder与StringBuffer的区别
			
1.String类是public.final修饰的. 在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法. 查看源码得知,String类其实是通过c ...
 - puppeteer设置代理并检查代理是否设置成功
			
1. 设置代理: 这一步超级简单,但我掉到了坑里并扑腾了小一天的时间,那就是:箭头指向处一定一定不要加空格!!! 2. 检查代理是否设置成功: 在打开的浏览器里,打开百度,输入ip,如果查出来的结果跟 ...
 - SQL Server 怎样生成序列号(虚拟数字辅助表)
			
</pre><pre name="code" class="sql">--生成一个"序列" 或者说生成一个" ...
 - saltstack进阶
			
查看minion端的文件内容 [root@linux-node2 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 1 ...
 - spring 整合 struts2 + Hibernate application配置文件(基于注解)
			
下面是 application.xml 文件. <?xml version="1.0" encoding="UTF-8"?> <beans x ...
 - jmeter 兼容bug 记录一笔
			
这个问题我也遇到过,然后网上搜到了这篇文章! 先说下问题: 我在做性能测试时,使用JMeter搞了100个并发,以100TPS的压力压测十分钟,但压力一直出现波动,而且出现波动时JMeter十分卡,如 ...
 - python的N个小功能(更新文件)
			
########################################################################## #对于第二份文件:第一份与第二份不相同,以第二份为 ...
 - Win10 安装 Linux 子系统
			
Win10 安装 Linux 子系统 因为最近要使用Linux搭服务器,但是用远程的话延迟很烦,用双系统切换很麻烦,用虚拟机又会有点卡,刚好Windows10最近更新了正式版的WSL(windows下 ...
 - list的4种遍历方式
			
import java.util.ArrayList;import java.util.Iterator;import java.util.List; import com.hbut.domain.P ...