当输入中有空行时,如何在 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;
}
复制代码

输入:

这

是

海

拥
复制代码

输出:

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

猜你喜欢

转载自juejin.im/post/7033677795540598815