theme: channing-cyan highlight: a11y-dark
「这是我参与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;
}
输入:
这
是
海
拥
输出:
这:换行符
是:换行符
海:换行符
拥:换行符