当输入中有空行时,如何在 C++ 中使用 getline()?

简介: 在 C++ 中,如果我们需要从一个流中读取好几个句子,我们通常会首选的方法是使用 getline() 函数。因为它可以读取直到遇到换行符或看到用户提供的分隔符

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战


在 C++ 中,如果我们需要从一个流中读取好几个句子,我们通常会首选的方法是使用 getline() 函数。因为它可以读取直到遇到换行符或看到用户提供的分隔符。


C++中本质上有两种getline函数,一种在头文件< istream >中,是istream类的成员函数。一种在头文件< string >中,是普通函数。 一、在< istream >中的getline函数有两种重载形式:


istream& getline (char* s, streamsize n );


istream& getline (char* s, streamsize n, char delim ); 作用是从istream中读取至多n个字符保存在s对应的数组中。即使还没读够n个字符,如果遇到换行符’\n’(第一种形式)或delim(第二种形式),则读取终止,’\n’或delim都不会被保存进s对应的数组中。


二、在< string >中的getline函数有四种重载形式:


istream& getline (istream& is, string& str, char delim);


istream& getline (istream&& is, string& str, char delim);


istream& getline (istream& is, string& str);


istream& getline (istream&& is, string& str);


用法和上一种类似,不过要读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。


下面是一个用 C++ 编写的示例程序,它读取四个句子并以“:换行符”在结尾显示它们

// 一个简单的 C++ 程序来显示 getline 的工作
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
  string str;
  int t = 4;
  while (t--)
  {
    // 从 str 中的标准输入读取一行
    getline(cin, str);
    cout << str << " : 换行符" << endl;
  }
  return 0;
}
复制代码


样本输入:

复制代码


正如预期的输出是:

这:换行符
是:换行符
海:换行符
拥:换行符
复制代码


上面的输入和输出看起来不错,输入之间有空行时可能会出现问题。


样本输入:

复制代码


输出:

这:newline
 :newline
是:newline
 :newline
复制代码


它不打印最后 2 行。原因是即使没有读取任何字符, getline() 也会读取直到遇到 enter 。因此,即使第三行没有任何内容,getline() 也会将其视为单行。进一步观察第二行的问题。


可以修改代码以排除此类空行。


修改后的代码:

// 一个简单的 C++ 程序,它使用 getline 读取带有空行的输入
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
  string str;
  int t = 4;
  while (t--)
  {
    getline(cin, str);
    // 有空行时继续阅读新行
    while (str.length()==0 )
      getline(cin, str);
    cout << str << " : 换行符" << endl;
  }
  return 0;
}
复制代码


输入:

复制代码


输出:

这:换行符
是:换行符
海:换行符
拥:换行符



目录
相关文章
|
8月前
|
Java C++ Python
C++ 使用getline():从文件中读取一行字符串
getline() 方法从 cin 输入流缓冲区中读取一行字符串。在此基础上,getline() 方法还适用于读取指定文件中的一行数据,本节就给大家做详细的讲解。 我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时,该方法的功能就变成了从指定文件中读取一行字符串。该方法有以下 2 种语法格式: istream & getline(char* buf, int bufS
124 0
|
7月前
|
Java C++ Python
C++ 使用getline()从文件中读取一行字符串
我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时,该方法的功能就变成了从指定文件中读取一行字符串。 该方法有以下 2 种语法格式: istream & getline(char* buf, int bufSize); istream & getline(char* buf, int bufSize, char delim); 其中,第一种语法格式用于从文件输入流
64 1
|
存储 测试技术 C++
在 C++ 中标记字符串与getline() 函数和字符数组
对字符串进行标记表示根据某些分隔符拆分字符串。有很多方法可以对字符串进行标记。在这篇文章中解释了其中的四个
86 0
|
缓存 C++
C++中cin,getline,cin.getline::如何输入包括空格的字符串
C++中cin,getline,cin.getline::如何输入包括空格的字符串
330 0
|
数据安全/隐私保护 iOS开发 C++
【C/C++学院】0826-文件重定向/键盘输入流/屏幕输出流/字符串输入输出/文件读写简单操作/字符文件读写二进制与文本差别/get与getline挖掘数据/二进制与文本差别/随机位置/多线程初级
&lt;p&gt;&lt;/p&gt; &lt;h2&gt; &lt;span style=&quot;font-family:宋体; font-size:16pt&quot;&gt;文件重定向&lt;/span&gt;&lt;span style=&quot;font-family:宋体; font-size:16pt&quot;&gt;&lt;/span&gt; &lt;/h2&gt; &lt;img src=&quot;http://img.blog.csdn.net/20151103141629604&quot; alt=&quot;&quot;&gt;&lt;br&gt;
1946 0
|
C++
C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1、cin 2、cin.get() 3、cin.
1010 0
|
2天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
18 0
|
1天前
|
C语言 C++ 容器
C++ string类
C++ string类
8 0
|
2天前
|
C++ Linux