cin 和 getline 混用中需要注意的问题

这段时间在刷题过程中遇到一个cin和getline混合使用中的问题,解决之后记录如下:

先来看一段代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 int main() {
 6     string str;
 7     int n = 0;
 8     cin >> n;
 9     cout << "num: " << n << endl;
10     while (n--) {
11         getline(cin, str);
12         cout << "string: " << str << endl;
13     }
14
15     return 0;
16 }

这是一段很简单的测试代码,结果应该也是可以预期的,但结果仍然有些奇怪的地方

这里没有结果的输出是怎么回事?

我们先看下cin>>与getline的工作方式,流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。getline函数从istream中读取一行数据,当遇到“\n”时结束返回。
    造成程序错误结果的原因是,在输入完相应的数字后按回车结束输入,把“\n”留在了输入流里,而cin不会主动删除输入流内的换行符,这样换行符就被getline读取到,getline遇到换行符返回,程序不会等待下一个输入,因此这里出现了一个没有结果的输出,getline读入了cin之后的回车换行符。

解决方案:

手动清除换行符,cin输入结束后使用

cin.ignore();

就可以有效解决这个问题。

总结:

在cin和getline混合使用的过程中,使用cin.ignore()清除输入流中的换行符。

原文地址:https://www.cnblogs.com/moujun1001/p/9551561.html

时间: 2024-08-05 03:44:34

cin 和 getline 混用中需要注意的问题的相关文章

C++中的cin、getline()、get()。

cin是C++中常用的一种输入方式,通常与>>运算符结合使用,解释为从输入流中抽取出字符存入到想要保存的变量中. eg: #include <iostream> using namespace std; int main() { char name[20]; cout << "Enter your name: " << endl; cin >> name; cout << "your name is: &

string 类型的输入操作符 cin 和 getline 函数分别如何处理空白字符?

string用来读取一个word : string 类型的输入操作符 cin 对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中). getline 函数用来读取整行文本,接受两个参数:一个输入流对象和一个 string 对象,例如 getline(cin,line): getline 函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在

C++IO关于cin&gt;&gt;和getline的理解

这个问题困扰了我有一段时间了,趁着十一放假有时间,仔细研究了一下 首先来看一下输入输出运算符cin>>的构成:cin和>> cin>>是由两部分构成的,cin和>>,其中cin是输入流istream类的一个对象,隶属于iostream函数库 而>>则是运算符:这个运算符的作用是:从左侧cin对象中读取数据,并将它赋给右侧的运算对象 大体的大概说完了,接下来就是干货了!! ......................................

20140923 cin.get() getline cin

#include<iostream> #include<string> using namespace std; int main() {     string title;     getline(cin,title);//读取输入队列中的回车,但是丢弃不存储在title中     //cin>>title;//不读取输入队列中的回车,回车仍然在输入队列中     char a=cin.get();//读取输入队列中多余的回车 }

P1308 统计单词数(cin,getline() ,transform() )

题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 ). 输入格式 共 2 行. 第 1 行为一个字符串,其中只含字母

C/C++走过的坑

1.有符号int与无符号int比较 #define TOTOL_ELEMENTS (sizeof(a) / sizeof(a[0]) ); int main() { int a[] = {23,24,34}; int d = -1; if(d<=TOTOL_ELEMENTS) printf("TRUE\n"); else printf("FLASE\n"); return 0; } //结果是FLASE而不是TRUE 结果分析:sizeof() 返回的是无符号

C++ 中的 cin/cin.get()/cin.getline()/getline/getchar()

在C++中有关从终端中输入数据的函数的理解一直比较模糊,写在这里面来分享给大家,并且方便自己以后查阅. 我一般在写C++程序的时候都会在头文件中引入iostream, cstdio, cstring, cmath这几个文件,以便方便后面相关库内函数的应用.下面,将按照顺序介绍这些函数. 1. cin cin是从文件输入流中取出一个int/char/string等.最简单的用法是输入一个数字,即 #include <iostream> using namespace std; main () {

缓冲区 cin() getline() getchar()

程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入 一. cin>> 该操作符是根据后面变量的类型读取数据. 输入结束条件 :遇到Enter.Space.Tab键. 对结束符的处理 :将\n类似的结束符落在缓冲区里. 所以会有如下的程序和结果: #include <

C++:cin、cin.getline()、getline()的用法

主要内容: 1.cin用法 2.cin.getline()用法 3.getline()用法 3.注意的问题 一.cin>> 用法1:输入一个数字或字符 #include <iostream>using namespace std;main (){int a,b;cin>>a>>b;cout<<a+b<<endl;} 用法2:接收一个字符串,遇“空格”.“TAB”.“回车”就结束 #include <iostream>usi